Django 中间件
CBV装饰器
写一个装饰器验证session
def login_auth(func):
def inner(request,*args,**kwargs):
if request.session.get('is_login'):
return func(request,*args,**kwargs)
else:
return redirect('/login/')
return inner
写一个类作为网站主页,必须登陆才能访问
# 给里面的get,post方法加装饰器
class Home(View):
def get(self,request):
pass
def post(self,request):
pass
三种加装饰器的方法
1,直接加在方法上,只针对那一个方法
class MyHome(View):
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
@method_decorator(login_auth) # 第一种
def get(self,request):
return HttpResponse('get')
def post(self,request):
return HttpResponse('post')
2,类名上面加装饰器
from django.utils.decoration import method_decorator
@method_decorator(login_auth,name='get') # 加在类上面的话,必须通过name指定给谁加
class Home(View):
def get(self,request):
pass
def post(self,request):
pass
3,方法上面加,不要用原生的装饰器,用的话,只能改参数,那样的话不通用
class Home(View):
@method_decorator(login_auth)
def get(self,request):
pass
def post(self,request):
pass
# @method_decorator(login_auth,name='get') # 第二种 name参数必须指定 class MyHome(View): @method_decorator(login_auth) # 第三种 get和post都会被装饰 def dispatch(self, request, *args, **kwargs): super().dispatch(request,*args,**kwargs) # @method_decorator(login_auth) # 第一种 def get(self,request): return HttpResponse('get') def post(self,request): return HttpResponse('post')
django中间件
中间件类似于django的门卫,数据在进入和离开时都需要经过中间件
django默认有七个中间件,
但是django暴露给用户可以自定义中间件并且里面可以写五种方法
ps:
1.请求来的时候会依次执行每一个中间件里面的process_request方法(如果没有直接通过)
2.响应走的时候会依次执行每一个中间件里面的process_response方法(如果没有直接通过)
django中间件能够帮我实现 网站全局的身份验证,黑名单,白名单,访问频率限制,反爬相关
》》》:django用来帮你全局相关的功能校验
自定义中间件
新建一个任意名字的文件夹,里面新建一个任意名字py文件
from django.utils.deprecation import MiddlewareMixin
一共有五个方法
process_request:请求来的时候从上往下依次执行每一个中间件里面的process_request
process_response :响应走的时候会从下往上依次执行每一个中间件里面的process_response方法
process_view:路由匹配成功执行视图之前自动触发 (从上往下依次执行)
process_exception:当视图函数报错了,自动触发 (从下往上依次执行)
process_template_response:视图函数返回的对象有一个render()方法,或者表明该对象是一个TemplateResponse对象或等价方法)(从下往上依次执行)
注意,如果一个中间件走process_request时直接return的话会直接走自己的process_response 返回,这个时候这个中间件后 面的中间件就不会走(可以用来设置黑名单)
csrf(跨站请求伪造)
什么时钓鱼网站?
钓鱼网站:银行转账的路径,你是否也可以拿到,然后你做一个跟银行一模一样的页面,也超银行的借口提交数据,当用户在钓鱼网站输入对方账户名和转账金额之后,点击发送。其实内部是将对方账户换成了钓鱼网站的造假人员的账户。造成你转账转错账户的情况
开两个django项目,模拟转账的现象
如何区分钓鱼网站和正经网站?在正经网站返回页面的时候,在form表单中偷偷塞一个特殊的字符串,后端记下该页面对应的字符串的值,等用户发post请求来的时候,我先去校验特殊的字符串是否匹配
如何去写这个特殊的字符串呢?模版语法有一个固定的写法{% csrf_token %},必须写在form表单内
浏览器查看改标签的值,并且每次都在刷新。再来演示刚刚转账的示例
ajax中如何设置csrf_token
# 第一种页面上先写一个{%csrf_token%}标签,后面用jquery查找标签取值组成键值对放入data中即可
csrf_token局部使用
# 只想给某个视图韩式加上csrf校验
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 局部禁用
@csrf_exempt
def index(request):
pass
# 局部使用
@csrf_protect
def login(request):
pass
csrf_protect 跟正常的CBV装饰器一样 三种
csrf_exempt 只能有下面两种方式
@method_decorator(csrf_exempt,name='dispatch') # 第一种
class Index3(View):
# @method_decorator(csrf_exempt) # 第二种
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
其实都是给dispatch加