定义装饰器:
from functools import wraps
def login_auth(func):
@wraps(func)
def inner(request, *args, **kwargs):
if request.session.get('name'):
return func(request, *args, **kwargs)
return redirect('/login')
return inner
CBV加装饰器:
from django.utils.decorators import method_decorator # 调用这个模块
@method_decorator(login_auth,name='get') # 第二种 name参数必须指定
class MyHome(View):
@method_decorator(login_auth) # 第三种 get和post都会被装饰,在MyHome内定义的方式都会被装饰
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中间件在项目中的用途:网站全局的身份验证,黑名单,白名单,访问频率限制,反爬相关
总而言之,django的中间件帮我们实现全局相关的功能校验。
django的请求生命周期:
django默认的7个中间件:
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',
]
django暴露给用户可以自定义中间件并且提供了5种方法:
以上的返回值可以是None或一个HttpResponse对象,如果是None,继续按照django定义的规则向后执行,如果是HttpResponse对象,则直接将该对象返回给用户。
自定义中间件示例
总结(自定义的五个方法):
process_request: 请求来的时候从上往下依次执行每一个中间件里面的process_request
process_response:响应走的时候从上往下依次执行每个中间件里面的process_response方法
process_view:路由匹配成功执行视图之前自动触发(从上往下依次执行)
process_exception:当视图函数报错,自动触发(从上往下依次执行)
process_templae_response:视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)(从上往下依次执行)
csrf跨站请求伪造:钓鱼网站通过仿造前端页面,在form表单中隐藏了一个input标签。
示例:
钓鱼网站
为了防止这类问题的发生:在form表单中也隐藏一个input标签,后端随时发送一个动态字符串。
基于django 前端form表单中加入:{% csrf_token %} 显示如下效果:
ps:value是动态生成的,每一次刷新都不一样。
基于ajax实现这种方法:
部分函数指定不校验:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt # 全局中,指定这个函数不校验csrf
def index1(request)
return HttpResponse('ok')
@csrf_protect # 全局中,制定这个函数校验csrf
def index2(request)
return HttpResponse('ok')
csrf装饰CBV
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)