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

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

猜你喜欢

转载自www.cnblogs.com/zqfzqf/p/11986379.html