zoukankan      html  css  js  c++  java
  • Django --- cookie与session,中间件

    1.cookie与session

    1.cookie

    1.什么是cookie

    因为HTTP协议是无状态的,所以为了保存客户端的用户状态,在客户端就是用cookie来保存用户的状态

    注意:cookie是保存在客户端的校验

    2.cookie的特性

    • 是保存在客户端浏览器上的键值对
    • cookie的值可以通过自己来设置,也可以通过服务端来设置
    • 浏览器有权禁止cookie的写入

    3.django如何操作cookie

    在使用小白必会三板斧的时候,不能直接使用,需要进行一下转化,但是使用的方式还是一样的

    obj = HttpResponse()      # 利用obj对象你才可以操作cookie
    return obj
    			
    obj = render()
    return obj
    			
    obj = redirect()
    return obj
    

    4.如何设置cookie

    1.设置cookie值

    obj.set_cookie('k1','v1')    # 对浏览器中的cookie进行设置
    

    2.获取cookie值

    request.COOKIE.get('k1')     # 获取浏览器携带过来的cookie值
    

    3.设置cookie的超时时间

    obj.set_cookie('k1','v1',max_age=3)
    obj.set_cookie('k1','v1',expires=3)
    
    两者的区别:
    1.相同点:两个参数都是设置时间的,并且都是以秒为单位
    2.不同点:IE只能使用expires设置超时时间,
    

    4.删除cookie

    obj.delete_cookie('k1')
    

    2.session

    因为前端的校验太过于简单,所以为了安全,使用后端校验,这样的可以保证数据的安全,也可以对用户的登录进行设置。session也可以存数据“。

    注意:session是在服务端的,数据在服务端按照键值对的行式进行保存,session的工作需要依赖于cookie。

    django中的session是针对浏览器的

    session可以放在任意能够作为数据库的地方:文件,内存,缓存,配置文件。

    1.设置session

    在django中设置session的时候需要注意的是,数据库中一定要有django_session表,如果没有的话执行数据库迁移命令

    >>> python manage.py makemigrations
    >>> python manage.py migrate
    

    2.session默认时间

    session默认的失效时间是14天,也就是两周

    3.设置session值

    1.添加session

    request.session['k1'] = 'v1'
    
    这一步的操作执行的事情:
    1.django会自动生成一个随机的字符串
    2.django将发送过去的数据键值对也进行加密
    3.将产生的随机字符串返回给客户端浏览器,让浏览器保存,是再cookie中保存的,方式是sessionid:随机字符串
    

    2.获取session

    request.session.get('k1')
    
    这一步的操作执行的事情
    1.django内部会自动去请求头里面获取cookie
    2.拿着sessionid所对应的随机字符串去django_session表中一一对比
    3.如果比对上了,会将随机字符串对应的数据获取出来,自动放入request.session中供程序员调用,如果没有值就返回一个空字典
    

    3.删除session

    request.session.delete()   # 会将客户端与服务端的数据全部删除
    request.session.flush()    # 客户端删除,服务端保留
    

    4.设置失效时间

    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
     * 如果value是个整数,session会在些秒数后失效。
     * 如果value是个datatime或timedelta,session就会在这个时间后失效。
     * 如果value是0,用户关闭浏览器session就会失效。
     * 如果value是None,session会依赖全局session失效策略。
    

    5.其他功能

    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.session_key
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    # 删除当前会话的所有Session数据
    request.session.delete()
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush()
     这用于确保前面的会话数据不可以再次被用户的浏览器访问
     例如,django.contrib.auth.logout() 函数中就会调用它。
    

    总结:cookie与session就是为了存储数据的,可以帮助保存用户的状态,cookie再客户端,session在服务端。

    2.中间件

    django 默认有五个中间件,并且支持用户自定义中间件,暴漏给用户五个可以自定义的五个方法

    1.中间件作用

    想要做一些网站的全局性功能,都可以考虑使用django的中间件

    1.全局的用户登录校验

    2.全局的用户访问频率校验

    3.全局的用户权限校验

    包含全局的都可以使用中间件完成操作

    2.用户可以自定义的五个方法

    方法一

    process_request  # 请求来的时候触发
    

    1.请求来的时候会按照settings配置文件中从上往下的顺序,依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法,直接跳过执行下一个中间件

    2.该方法一旦返回了HttpResponse对象,呢么请求会立刻停止往后走,原路返回

    方法二

    process_response   # 请求响应的时候触发
    

    1.响应的时候会按照settings配置文件中从下往上的顺序,依次执行每一个中间件内部定义的process_response方法

    2.该方法有两个形参(request,response),并且必须返回response形参,不返回直接报错

    3.该方法返回什么(HttpResponsed对象),前端就能获得什么

    总结:当process_request方法直接返回HttpResponse对象之后,会直接从当前中间件里面的process_response往回走,没有执行的中间件都不会再执行

    方法三

    process_view    # 路由匹配成功之后,执行视图函数之前触发
    

    1.路由匹配成功执行视图函数之前触发

    2.如果该方法返回了HttpResponse对象,呢么会从下往上依次经过每一个中间件里的process_response

    方法四

    process_templates_response     # 
    

    1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发,从下往上顺序

    方法五

    process_exception    # 当视图函数中出现错误的时候会自动触发
    

    1.当时图函数中出现错误,会自动触发,顺序是从上往下

    上面这五个方法,会在特定的阶段自动触发

    3.自定义中间件

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse,render,redirect
    
    class MyMdd1(MiddlewareMixin):
        def process_request(self,request):
            print('我是第一个中间件里面的process_request方法')
            # return HttpResponse("我是中间件一里面的")
    
        def process_response(self,request,response):
            """
            :param request:
            :param response: 就是后端返回给前端的数据
            :return:
            """
            print('我是第一个中间件里面的process_response方法')
            return response
            # return HttpResponse("我是中间件一里面的")
    
        def process_view(self,request,view_name,*args,**kwargs):
            print(view_name)
            print(args)
            print(kwargs)
            print('我是第一个中间件里面的process_view方法')
            # return HttpResponse("我是中间件一里面的process_view")
    
        def process_exception(self,request,exception):
            print('我是第一个中间件里面的process_exception')
            print(exception)
    
        def process_template_response(self, request, response):
            print('我是第一个中间件里面的奇葩方法')
            return response
    
    
    
    class MyMdd2(MiddlewareMixin):
        def process_request(self,request):
            print('我是第二个中间件里面的process_request方法')
            # return HttpResponse('我是中间件二里面的')
    
        def process_response(self,request,response):
            """
            :param request:
            :param response: 就是后端返回给前端的数据
            :return:
            """
            print('我是第二个中间件里面的process_response方法')
            return response
    
            # return HttpResponse("我是中间件二里面的")
        def process_view(self,request,view_name,*args,**kwargs):
            print(view_name)
            print(args)
            print(kwargs)
            print('我是第二个中间件里面的process_view方法')
            # return HttpResponse("我是中间件二里面的process_view")
    
        def process_exception(self, request, exception):
            print('我是第二个中间件里面的process_exception')
            print(exception)
    
        def process_template_response(self, request, response):
            print('我是第二个中间件里面的奇葩方法')
            return response
    

    注意点:

    1.新建一个文件夹,新建一个文件写中间件

    2.需要在settings中进行配置,按照规定的格式进行配置

    3.中间件中执行的顺序是从上往下,回去的时候是从下网上

    4.写自定义中间件的时候要继承类:MiddlewareMixin

    5.上面的五点按照方法的行式写在新建的类中,在特殊情况下会自动触发

  • 相关阅读:
    百度面试题:把数组排成最小的数
    面试题:在O(1)时间删除链表结点
    从第一字符串中删除第二个字符串中所有的字符
    在一个字符串中找到第一个只出现一次的字符
    大整数运算
    输出1到最大的N位数
    删除字符串中的数字并压缩字符串
    排列 或组合问题的解法(包含回溯法)
    卡特兰数(Catalan)简介
    编程之美-分层遍历二叉树
  • 原文地址:https://www.cnblogs.com/whkzm/p/11987173.html
Copyright © 2011-2022 走看看