zoukankan      html  css  js  c++  java
  • day58 cookie session 中间件

    cookie与session简介及操作

    为什么会有这些技术
    ​ 1.目的是为了保存客户端的用户状态
    ​ 2.原因:HTTP协议是无状态的

    cookie:保存在客户端浏览器上的键值对
    cookie虽然是保存在客户端浏览器上的键值对,但它是由服务端设置的,浏览器有权禁止cookie的写入

    django如何操作cookie

    小白必会三板斧
    利用obj对象才可以操作cookie

    obj=HttpResponse()
    obj=render()
    obj=redirect()
    return obj
    

    设置cookie

    obj.set_cookie('k1','v1')#告诉浏览器设置cookie
    

    获取cookie

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

    设置cookie的超时时间

    两个参数都是设置时间,并且都是以秒为单位
    区别:如果想要给IE浏览器设置cookie的超时时间,只能用expires

    obj.set_cookie('k1','v1',max_age=3)
    obj.set_cookie('k1','v1',expires=3)
    

    删除cookie

    (注销  退出登录)
    obj.delete_cookie('k1')
    
    def login(request):
        if request.method=='POST':
            username=request.POST.get('username')
            password=request.POST.get('password')
            if username=='jason' and password=='123':
                old_path=request.GET.get('next')
                if old_path:#防止用户直接访问login页面
                    obj=redirect(old_path)
                else:
                    obj=redirect('/home/')#默认跳转到首页
                # obj.set_cookie('whoami','jason',max_age=10)#告诉浏览器保存一个键值对,max_age=10:十秒后失效
                obj.set_cookie('whoami','jason')#告诉浏览器保存一个键值对,max_age=10:十秒后失效
                return obj
        return render(request,'login.html')
    
    #装饰器
    from functools import wraps
    def login_auth(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            #判断当前用户是否登录
            print(request.path_info)#只获取url
            print(request.get_full_path())#获取url+get参数
            if request.COOKIES.get('whoami'):
                res=func(request,*args,**kwargs)
                return res
            else:
                target_path=request.path_info
                return redirect('/login/?next=%s'%target_path)
        return inner
    
    @login_auth
    def home(request):
        #校验用户是否登录
        # if request.COOKIES.get('whoami'):
        return HttpResponse('home页面 只有登录的人才可以访问')
    
    @login_auth
    def index(request):
        return HttpResponse('index页面 只有登录的人才可以访问')
    
    @login_auth
    def logout(request):
        obj=redirect('/login/')
        obj.delete_cookie('whoami')
        return obj
    

    session

    session:保存在服务端上的键值对
    session的工作机制是依赖于cookie的

    设置session

    django session在创建数据的时候,是针对浏览器的

    request.session['k1']='v1'
    

    第一次设置的时候会报错 :没有执行数据库迁移命令,生成django需要用到的一些默认表(django_session)

    django的默认session失效时间是14天

    request.session['k1']='v1'做了那些事:
    1.django内部自动调用算法生成一个随机的字符串(数据也是加密处理)
    2.在django_session添加数据
    随机字符串 加密之后的数据 失效时间
    dnsfj ksdfjksjfksjfdjf
    3.将产生的随机字符串返回给客户端浏览器,让浏览器保存
    sessionid:随机字符串

    获取session

    request.session.get('k1')
    

    1.django内部会自动去请求头里面获取cookie
    2.拿着sessionid所对应的随机字符串去django_session表中一一比对
    3.比对上了就会将随机字符串对应的数据获取出来,自动放在request.session中共程序员调用。如果没有比对上就是一个空字典

    删除session

    request.session.delete()#客户端和服务端全部删除,只会根据浏览器的不同删除对应的数据
    request.session.flush()
    

    设置session失效时间

    request.session.set_expriy(5)
    request.session.set_expriy(value)
    如果value是一个整数,session会在value秒数之后失效
    如果value是一个datatime或timedelta,session就会在这个时间后失效
    如果value是0,用户关闭浏览器session就会失效
    如果value是None,session会依赖全局session失效策略
    
    def set_session(request):#设置session
        request.session['k1']='jason666'
        request.session.set_expiry(10)#设置失效时间
        # request.session['k2']='json666'
        # request.session['k']='jasn666'
        return HttpResponse('设置成功')
    
    def get_session(request):#获取session
        if request.session.get('k1'):
            # res=request.session.get('k1')
            # res=request.session.get('k2')
            # res=request.session.get('k3')
            return HttpResponse('获取成功')
        return HttpResponse('失效了')
    
    def delete_session(request):#删除session
        request.session.delete()#客户端 服务端全部删除
        # request.sesion.flush()#建议使用这个
        return HttpResponse('删除了')
    

    session补充

    能够作为数据库的:数据库软件(关系型,非关系型)、文件、内存

    token:加密字符串

    django中间件

    django默认有七个中间件:

    只要你想要做一些网站的全局性功能,你都应该考虑使用django的中间件
    1.全局的用户登录校验
    2.全局的用户访问频率校验
    3.全局的用户权限校验
    django的中间件是所以框架里面的做的最完善的

    对象 字符串》》》》反射
    全局》》》》》》》》中间件

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

    需要掌握:

    process_request

    1.请求来的时候会按照settings配置文件从上往下的顺序,依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法,直接跳过执行下一个中间件
    2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走,原路立即返回

    process_response

    1.响应走的时候会按照settings配置文件从下往上的顺序,依次执行每一个中间件内部定义的process_response方法。
    2.该方法必须有两个形参,并且必须返回response形参,不返回直接报错
    3.该方法返回什么(httpResponsed对象),前端就能获取什么

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

    需要了解:

    process_view

    process_view(self,request,view_name,*args,**kwargs)
    

    1.路由匹配成功之后执行视图函数之前触发
    2.如果该方法返回了HttpResponse对象,那么会从下往上经过每一个中间件里面的process_response方法

    process_template_response

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

    process_exception

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

    以上五个方法,会在特定的阶段自动触发(如果形参中含有response,那么必须要返回)

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse,redirect,render
    class MyMdd1(MiddlewareMixin):
        def process_request(self,request):
            print('我是第一个中间件里面的process_request方法')
            # return  HttpResponse('我是中间件一里面的')
    
        def process_response(self,request,response):
            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):
            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
    
    

    如何利用中间件做权限管理

  • 相关阅读:
    异步编程与scrapy
    统计学 李航读书笔记
    算法模型手写
    《剑指offer》面试题的Python实现
    numpy 中文手册
    django部署
    Django ORM中使用update_or_create功能再解
    RabbitMQ(七)心跳控制 -- heartbeat
    重写__eq__函数——对象list中使用in index()——获得list中不同属性对象个数
    Python机器学习及分析工具:Scikit-learn篇
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/11986379.html
Copyright © 2011-2022 走看看