(资料图)
- Django中间件
- 一、中间件定义
- 二、如何自定义中间件
- 三、中间件类绑定的方法里需要掌握的
- 四、中间件类绑定的方法里需要了解的
- 五、cookie与session简介
- 六、django操作cookie
- 七、django操作session
Django中间件
一、中间件定义
django默认有七个中间件 并且还支持用户自定义中间件中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
二、如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)2.参考自带中间件的代码编写类并继承3.在类中编写五个可以自定义的方法4.一定在配置文件中注册中间件才可以生效
通过看源码 发现中间件的写法都是一样的其实都类,然后里面绑定了一些方法然后在配文件里面一注册 就可以生效了利用字符串导入模块需要导入importlib模块
import importlibs1 = "bbb.b" # aaa.bbb.ccc.bres = importlib.import_module(s1) # from aaa.bbb.ccc import bprint(res) # """注意字符串的结尾最小单位只能是py文件 不能是py文件里面的变量名"""
三、中间件类绑定的方法里需要掌握的
process_request1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回3.如果在执行该方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response不是执行所有
process_response1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
四、中间件类绑定的方法里需要了解的
1.process_view路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)2.process_exception视图函数/类执行报错自动触发(顺序同process_response)3.process_template_response视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)
五、cookie与session简介
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的随着互联网的发展很多网站需要指定当前用户的状态cookie保存在客户端与用户状态相关的信息 浏览器有资格拒绝保存服务端发送过来的cookie数据session保存在服务端与用户状态相关的信息session的工作需要依赖于cookie
六、django操作cookie
from django.shortcuts import render,HttpResponse,redirectreturn render()return HttpResponse()return redirect()
要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收obj1 = render()return obj1obj2 = HttpResponse()return obj2obj3 = redirect()return obj3
编写一个真正的用户登录功能def login_func(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") if username == "jason" and password == "123": obj = redirect("/home/") obj.set_cookie("name", username) return obj return render(request, "loginPage.html")def login_auth(func_name): def inner(request, *args, **kwargs): if request.COOKIES.get("name"): res = func_name(request, *args, **kwargs) return res return redirect("/login/") return inner@login_authdef home_func(request): return HttpResponse("home页面 只有登录的用户才可以查看")
进阶操作:用户没有登录之前想访问某个网站输入用户名密码之后就应该调回该网站def login_func(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") 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", username) return obj return render(request, "loginPage.html")def login_auth(func_name): def inner(request, *args, **kwargs): # print(request.path) # 只获取用户输入的路由信息 # print(request.path_info) # 只获取用户输入的路由信息 target_path = request.path_info # print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据 if request.COOKIES.get("name"): res = func_name(request, *args, **kwargs) return res return redirect("/login/?next=%s" % target_path) return inner
七、django操作session
由于session是保存在服务端上面的数据 就应该有个地方能够存储我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表django默认的session失效时间是14天
设置sessionrequest.session["key"] = value 1.生成一个随机字符串 2.对value数据做加密处理 并在django_session表中存储 随机字符串>>>加密数据 3.将随机字符串也发送一份给客户端保存(cookie) sessionid:随机字符串获取sessionrequest.session.get("key") 1.自动获取随机字符串 2.去django_session表中根据随机字符串获取加密的数据 3.自动解密数据并处理到request.sesion.get()中 补充说明1.可以设置过期时间 2.存储session数据的位置也可以修改