Django框架07 /cookie和session

1. django请求生命周期

  • 浏览器上输入http://www.xxx.com 请求到达django后发生了什么? (还有中间件,此处没写)
  • web服务网关接口:wsgi、uwsgi

2. cookie

示例:博客系统

  1. 基本实现用户登录

  2. 用户未登录就不能访问指定页面

    • 会话

      • 客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。
    • 基于cookie实现
      • 保存在用户浏览器端的键值对,向服务端发请求时会自动携带。保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
  3. 后端操作cookie

    • 清除chrome浏览器页面缓存和cookie:Ctrl + Shift + del

    • 获取Cookie

      request.COOKIES['key']
      request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) # 参数:
      # default: 默认值
      # salt: 加密盐
      # max_age: 后台控制过期时间
    • 设置Cookie

      rep = HttpResponse(...)
      rep = render(request, ...) rep.set_cookie(key,value,...)
      rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...) # 参数:
      # key, 键
      # value='', 值
      # max_age=None, 超时时间
      # expires=None, 超时时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思
      # path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
      # domain=None, Cookie生效的域名
      # secure=False, https传输
      # httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    • 删除Cookie

      def logout(request):
      rep = redirect("/login/")
      rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
      return rep
    • 代码示例

      def login(request):
      # return HttpResponse('...')
      # return render('...')
      # return redirect('...')
      # 设置cookie
      data = redirect('...')
      data.set_cookie()
      # 读取cookie
      request.COOKIES.get('xx')
      return data # 三个参数:
      key, value='', max_age=None
  4. jquery操作cookie

    • 操作cookie前准备

      1.定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术;
      
      2.下载与引入:jquery.cookie.js基于jquery;先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/
      
      3.<script type="text/javascript" src="js/jquery.min.js"></script>
      <script type="text/javascript" src="js/jquery.cookie.js"></script>
    • 添加cookie

      // 1.添加一个"会话cookie"
      $.cookie('the_cookie', 'the_value'); //这里没有指明 cookie有效时间,所创建的cookie有效期默认到用户关闭浏览器为止,所以被称为 “会话cookie(session cookie)”。 // 2.创建一个cookie并设置有效时间为 7天
      $.cookie('the_cookie', 'the_value', { expires: 7 }); //这里指明了cookie有效时间,所创建的cookie被称为“持久 cookie (persistent cookie)”。注意单位是:天; // 3.创建一个cookie并设置 cookie的有效路径
      $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); //在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。
    • 读取cookie

      $.cookie('the_cookie');
    • 删除cookie

      $.cookie('the_cookie', null);   //通过传递null作为cookie的值即可
    • 可选参数

      $.cookie('the_cookie','the_value',{
      expires:7,
      path:'/',
      domain:'jquery.com',
      secure:true
      })  // expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
      // path:(String)创建该Cookie的页面路径;
      // domain:(String)创建该Cookie的页面域名;
      // secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
    • 注意点

      // js操作
      document.cookie = 'k1=liu;path=/'
      // jquery操作
      $.cookie('k1','liu',{path:'/'})
      // 注意:path不同会导致设置不同. //path的作用
      // / , 当前网站中所有的URL都能读取到此值.
      // "",只能在当前页面访问的到此数据.
      // /index/ ,只能在/index/xxx 的网页中查看. // 在浏览器操作cookie是路径path不写默认是""

3. session

  1. 基于session实现保留会话信息 / 推荐

  2. 什么是session

    依赖cookie
    是一种存储数据的方式,依赖于cookie,实现本质:
    用户向服务端发送请求,服务端做两件事:
    1.生成随机字符串;
    2.为此用户开辟一个独立的空间来存放当前用户独有的值.
    在空间中如何想要设置值:
    request.session['x1'] = 123
    request.session['x2'] = 456
    在空间中取值:
    request.session['x2']
    request.session.get('x2')
    视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中.
  3. cookie和session的区别

    答: cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).其本质是:
    用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值.
    在空间中如何想要设置值:
    request.session['x1'] = 123
    request.session['x2'] = 456
    在空间中取值:
    request.session['x2']
    request.session.get('x2')
    视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
  4. django中session相关的配置 / 拓展

    1.SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串
    
    2.SESSION_COOKIE_DOMAIN = None  # api.baidu.com /www.baidu.com/ xxx.baidu.com
    
    3.SESSION_COOKIE_PATH = "/"  # Session的cookie 保存的路径
    
    4.SESSION_COOKIE_HTTPONLY = True  # 是否 Session的cookie只支持http传输,js获取不到
    
    5.SESSION_COOKIE_AGE = 1209600  # Session的 cookie失效日期(2周)
    
    6.SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    
    7.SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存
    
    # django中的session如何设置过期时间?
    SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  5. django的session默认存储在数据库,可以放在其他地方吗

    • 小系统:默认放在数据库即可.
    • 大系统:缓存(redis)
    • 放在文件中配置
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'
    SESSION_FILE_PATH = '/sessiondata/'
    • 缓存(内存)
    SESSION_ENGINE =
    'django.contrib.sessions.backends.cache'
    SESSION_CACHE_ALIAS = 'default'
    CACHES = {  
    'default': {      
    'BACKEND': 'django.core.cache.backends.locmem.LocMem Cache',      
    'LOCATION': 'unique-snowflake',  
    }
    }
    • 缓存(redis)
    SESSION_ENGINE =
    'django.contrib.sessions.backends.cache'
    SESSION_CACHE_ALIAS = 'default'
    CACHES = {  
    default": {      
    "BACKEND": "django_redis.cache.RedisCache",      
    "LOCATION": "redis://127.0.0.1:6379",      
    "OPTIONS": {          
    "CLIENT_CLASS": "django_redis.client.DefaultClient",
    "CONNECTION_POOL_KWARGS": {"max_connections": 100}          
    # "PASSWORD": "密码",      
    }  
    }
    }
  6. 操作session

    # 设置(添加&修改)
    request.session['x1'] = 123
    request.session['x2'] = 456 # 读取
    request.session['xx']
    request.session.get('xx') # 删除
    del request.session['xx']
    # 删除当前会话的所有Session数据
    request.session.delete()
    # 删除cookie以及session
    request.session.flush()
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.session_key # 获取sessionid的值
    request.session.set_expiry(value) # 设置会话Session和Cookie的超时时间
    # 如果value是个整数,session会在些秒数后失效。
    # 如果value是个datatime或timedelta,session就会在这个时间后失效。
    # 如果value是0,用户关闭浏览器session就会失效。
    # 如果value是None,session会依赖全局session失效策略。

4. 总结

  • cookie/session的应用场景

    • 用户认证
    • 投票
    • 短信验证过期
    • 权限管理
  • session中的数据是根据用户相互隔离.

    # 示例
    def login(request):  
    # 获取用户提交的用户名和密码  
    user = request.POST.get('user')  
    request.session['user_name'] = user    
    def index(request):
    print(request.session['user_name'])
  • cookie代码示例

    from django.shortcuts import render,redirect
    from app01 import models def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
    return render(request, 'login.html') # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd') # 去数据库检查用户名密码是否正确的两种方式
    # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
    # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists() user_object = models.UserInfo.objects.filter(username=user, password=pwd).first() if user_object:
    # 用户登录成功
    result = redirect('/index/')
    result.set_cookie('xxxxxxxx',user)
    return result # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'}) def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    user = request.COOKIES.get('xxxxxxxx')
    if not user:
    return redirect('/login/') return render(request,'index.html',{'user':user})
  • session代码示例

    from django.shortcuts import render,redirect
    
    from app01 import models
    
    def login(request):
    '''
    用户登陆
    :param request:
    :return:
    '''
    if request.method == 'GET':
    return render(request,'login.html')
    user = request.POST.get('username')
    pwd = request.POST.get('password')
    ret = models.UserInfo.objects.filter(username=user,password=pwd).first()
    if ret:
    request.session['user_name'] = ret.username
    return redirect('/index/')
    return render(request,'login.html',{'error':'用户名或密码错误'}) #构建装饰器
    import functools
    def auth(f):
    @functools.wraps(f)
    def inner(request,*args,**kwargs):
    user = request.session.get('user_name')
    if not user:
    return redirect('/login/')
    return f(request,*args,**kwargs)
    return inner @auth
    def index(request):
    '''
    博客后台首页
    :param request:
    :return:
    '''
    return render(request,'index.html')

Django框架07 /cookie和session的更多相关文章

  1. Django框架 之 Cookie、Session整理补充

    Django框架 之 Cookie.Session整理补充 浏览目录 Django实现的Cookie Django实现的Session 一.Django实现的Cookie 1.获取Cookie 1 2 ...

  2. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  3. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

  4. Django框架之cookie和session及开发登录功能

    1.cookie是什么? Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从 ...

  5. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  6. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  7. 第三百一十二节,Django框架,Cookie

    第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...

  8. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  9. django基础 -- 8.cookie 和 session

    一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...

随机推荐

  1. [转] C++中的namespace

    点击阅读原文 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都 ...

  2. CentOS安装部署Mysql 5.7

    1,如果没有安装wget,先安装yum -y install wget 2,下载MySQL官方的 Yum Repositorywget http://repo.mysql.com/mysql57-co ...

  3. 消息队列——ActiveMQ使用及原理浅析

    文章目录 引言 正文 一.ActiveMQ是如何产生的? 产生背景 JMS规范 基本概念 JMS体系结构 二.如何使用? 基本功能 消息传递 P2P pub/sub 持久订阅 消息传递的可靠性 事务型 ...

  4. cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据

    cb09a_c++_顺序容器的操作2在顺序容器中添加元素vector不能向前插入数据,list可以用insertc.push_back(t);c.push_front(t);c.insert(p,t) ...

  5. springboot mybatis plus多数据源轻松搞定 (上)

    在开发中经常会遇到一个程序需要调用多个数据库的情况,总得来说分为下面的几种情况: 一个程序会调用不同结构的两个数据库. 读写分离,两个数据结构可能一样高,但是不同的操作针对不同的数据库. 混合情况,既 ...

  6. 看了Java的Class的源码,我自闭了

    java源码之Class ​ 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝.这是我的源码系列第二弹,后续还会一直更新,欢迎交流.String源码可以看我的Java源码之String,如有不足,希望 ...

  7. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...

  8. Codeforces Round #651 (Div. 2)

    感觉自己无可救药了. A题:找到小于等于n的两个不同的数的gcd最大是多少,显然是floort(n/2).设这两数是a * gcd, b * gcd然后gcd(a,b) = 1,那么gcd要尽量大,不 ...

  9. 入门大数据---Hive数据查询详解

    一.数据准备 为了演示查询操作,这里需要预先创建三张表,并加载测试数据. 数据文件 emp.txt 和 dept.txt 可以从本仓库的resources 目录下载. 1.1 员工表 -- 建表语句 ...

  10. 【asp.net core 系列】14 .net core 中的IOC

    0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源.路由设置.加密以及身份验证.那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造 ...