• Day 63 django 中间件、cookie、session


    Day 63 django 中间件、cookie、session

    1、cookie与session 简介

    HTTP协议四大特性

    1. 基于请求响应

    2. 基于TCP、IP作用于应用层上协议

    3. 无状态 服务端 不记录客户端的连接

      服务端无法识别客户端的状态

      1. 互联网刚开始兴起的时候 所有人访问网址都是一样的数据

        服务端 无法识别客户端问题不大

      2. 互联网发展 淘宝、京东、阿里

        服务端不得不想办法记住客户端的状态

        cookiesession 应运而生

    Cookie
    保存在客户端上用户信息(状态)相关的数据

    Session
    保存在服务端上用户信息(状态)相关的数据

    session的工作需要依赖于cookie 就算是目前所有能够识别用户身份的网址也都需要使用cooie(客户端浏览器也有权限拒绝保存cookie)

    2、django操作 cookie

    如果想要让客户端浏览器保存ciookie 需要HttpResonse对象调用方法

    return HttpResponse()
    return render()
    return redirect()
    return JsonRepsonse()
    
    • 1
    • 2
    • 3
    • 4

    设置cookie 需要变形

    obj = HttpResponse()
    obj.操作cookie的方法
    return obj
    
    obj = render()
    obj.操作cookie的方法
    return obj
    
    obj = redirect()
    obj.操作cookie的方法
    return obj
    
    obj = JsonRepsonse()
    obj.操作cookie的方法
    return obj
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.1、登录设置cookie

    多个视图函数都需要校验用户是否登录
    装饰器

    如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转

    获取网页地址后缀的方式

    request.path # 获取后缀
    request.path_info # 获取后缀
    request.get_full_path  # 将 后缀 后问号后面的 地址也能获取到
    
    • 1
    • 2
    • 3

    分两种可能场景

    1. 用户访问了其他需要登录才可以访问的页面

      登录成功后直接跳转至该页面

      通过 装饰器在校验cookie判断 没有登录时 将现在访问的网页地址后缀获取 存到地址后面

      在登录 成功后 将地址后面的取出 之前需要访问地址 直接 跳转

    2. 用户直接访问登录页面

      登录成功后直接跳转至 主页

    def login_user(funce):
        def inner(*args,**kwargs):
            if args[0].COOKIES.get('name'):
                res = funce(*args,**kwargs)
                return res
            else:
                target_path=args[0].path_info
                return redirect(f'/login/?next={target_path}')
        return inner
    
    
    def login(request):
        if request.method=='POST':
            username = request.POST.get('name')
            password = request.POST.get('pwd')
            if username =='jason' and password=='123':
                target_path=request.GET.get('next')
                if target_path:
                    obj = redirect(target_path)
                else:
                    obj = redirect('/home/')
                obj.set_cookie('name','jasonNB')
                return obj
        return render(request,'login.html')
    
    @login_user
    def home(request):
        # if request.COOKIES.get('name'):
        return HttpResponse('home页面')
        # return redirect('/login/')
    
    
    @login_user
    def index(request):
        # if request.COOKIES.get('name'):
        return HttpResponse('index页面 只有登录的用户 才可以查看')
        # return redirect('/login/')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    3、django操作session

    请求来之后服务端产生随机字符串 并发送给客户端保存 服务端存储随机字符串 与用户信息对应关系 之后客户端携带随机字符串 服务端自动校验

    django默认的session失效时间14天
    客户端会接收到键值对 键默认是sessionid值 是加密的随机字符串(令牌)

    request.session['name'] = 'jason'
    
    • 1

    django会自动产生一个字符串返回给客户端(并且对name加密)
    往django_session中匹配数据
    如果匹配上还会自动解密数据并展示

    request.session.get('name')
    
    • 1

    自动从请求中回去sessionid对应的随机字符串
    拿着随机字符串去django_session中匹配数据
    如果匹配上还会自动解密数据并展示

    session的存储位置 可以有五种模式

    1. 数据库
    2. 缓存数据库
    3. 文件
    4. 缓存+数据库
    5. 加密

    3.1、session其他操作

    删除当前会话的所有Session数据

    request.session.delete()
    
    • 1

    删除当前会话数据并删除会话的Cookie

    request.session.flush()
    
    • 1

    设置会话Session和Cookie的超时时间

    request.session.set_expiry(value)
    
    • 1
    • 如果value是个整数,session会在这秒数后失效
    • 如果value是个datatime timedelta,session就会在这个时间后失效
    • 如果value是0,用户关闭浏览器session就会失效
    • 如果value是None,session会依赖全局session失效策略

    4、django中间件

    django种间件类似于django的门户 所有的请求来和响应走都必须经过中间件
    django默认自带七个中间件 每个中间件都有各自负责的功能
    django中间件除了默认的之外 还支持自定义中间件(无限)

    django中间件使用场景
    全局相关使用场景:
    全局用户身份校验 全局用户黑名单校验 全局用户访问频率校验

    django自定义中间件中可以有五个方法:

    1. process_request
    2. process_response
    3. process_view
    4. process_template_response
    5. process_exception

    process_request

    1. 请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
    2. 该方法如果返回HttpResonse对象 那么请求不会再往下执行 而是原路返回

    process_response

    1. 响应走的时候会按照配置文件中注册了的中间件 从下往上依次执行每一个中间件里面的process_response方法 没有没有则直接跳过

    2. 该方法有两个形参requestresponse并且默认情况下应该返回response

    3. 该方法也可以自己返回HttpResponse对象 相当于狸猫换太子

      注意:如果请求的过程中 process_request方法直接返回了HttpRecsponse对象 anemic会原地执行同级别(即当前行的)process_response方法

    process_view

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

    2.                 # 即将执行的视图函数的 名字、位置参数、关键字参数
      def process_view(self,request,view_func,view_args,view_kwargs):
      
      • 1
      • 2

    process_excption
    当视图函数报错之后 自动触发

    process_template_response
    当视图函数返回的数据对象中含有render 属性对应 render函数才会触发

    4.1、自定义中间件

    首先 可以通过查看django自带的中间件查看中间件定义的规律
    导入 MiddlewareMixin 创建类继承 MiddlewareMixin

    from django.utils.deprecation import MiddlewareMixin
    
    class MyMdd1(MiddlewareMixin):
        def process_request(self,request):
            print('MyMdd1 process_request')
            # return HttpResponse('回去吧')
    
        def process_response(self,request,response):
            print('MyMdd1 process_response')
            return response
        def process_view(self,request,view_func,view_args,view_kwargs):
            print('MyMd1 process_view')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在类中 直接创建中间件方法 配上对应的形参即可

    再到配置文件settings.py中 依次写上创建好的中间件

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        #自定义的中间件
        'app01.utils.mymdd.MyMdd2',
        'app01.utils.mymdd.MyMdd1',
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    二、浏览器--事件循环(也叫事件环,也叫event loop)--任务队列(等待执行的任务(存放的定时器,http,事件等进程))--渲染三者的关系
    机器学习西瓜书学习记录-第四章 决策树
    软件定义汽车SDN的五大技术挑战--软件定义汽车产业生态创新白皮书发布
    基于美洲狮优化算法(Puma Optimizar Algorithm ,POA)的无人机三维路径规划(提供MATLAB代码)
    哈希表简介
    harib09c的编译和调试
    SQL优化--关联子查询的前世今生
    linux单机部署kafka
    Web前端:JavaScript的未来——发展趋势和预测
    多疑型性格的危害,如何改变多疑型性格?
  • 原文地址:https://blog.csdn.net/weixin_71967396/article/details/126818263