Django中间件
中间件介绍
官方的说法:中间件是-个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类, 类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
用户访问频率限制
用户是否是黑名单 白名单
所有用户登录校验
只要是涉及到网址全局的功能 你就应该考虑使用中间件
django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的)
需要掌握的:
process_request:请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别process_response
def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值") # 直接原地返回
process_response:响应走的时候 会从下往上依次进过每一个中间件里面的process_response
def process_response(self,request,response): # response就是要返回给用户的数据
print("我是第一个自定义中间件里面的process_response方法")
return response
了解的
process_view:路由匹配成功之后执行视图函数之前触发
process_exception:当视图函数出现异常(bug)的时候自动触发
process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
- 新建一个文件夹 里面新建一个任意名称的py文件
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse
class MyMiddle1(MiddlewareMixin):
def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
# return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")
def process_response(self,request,response): # response就是要返回给用户的数据 print("我是第一个自定义中间件里面的process_response方法") return response def process_view(self,request,view_func,view_args,view_kwargs): print(view_func,view_args,view_kwargs) print('我是第一个自定义中间件里面的process_view方法') def process_exception(self,request,exception): print(exception) print('我是第一个自定义中间件里面的process_exception方法') def process_template_response(self,request,response): print('我是第一个自定义中间件里面的process_template_response方法') return response
class MyMiddle2(MiddlewareMixin):
def process_request(self,request):
print('我是第二个自定义中间件里面的process_request方法')
def process_response(self, request, response): # response就是要返回给用户的数据 print("我是第二个自定义中间件里面的process_response方法") return response def process_view(self,request,view_func,view_args,view_kwargs): print(view_func,view_args,view_kwargs) print('我是第二个自定义中间件里面的process_view方法') def process_exception(self,request,exception): print(exception) print('我是第二个自定义中间件里面的process_exception方法') def process_template_response(self,request,response): print('我是第二个自定义中间件里面的process_template_response方法') return response
```
里面写类 固定继承
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
...
2.去配置文件注册到中间件配置中
你需要手写字符串的路径
'app01.mymiddleware.myaabb.MyMiddle1'
#### 中间件版登录验证:
中间件版的登录验证需要依靠session,所以数据库中要有Django_session表
urls.py:
from app02 import views a3 v2 urlpatterna = [ url (r1^admin/',admin. site.ur13), url (r1^1ogin/' ,v2.10gin), url (r'^home/' ,v2.home), url (I' ^index/',v2. index) ]
views.py
from django.shortcuts import render,redirect,HttpResponse from app02 import models # Create your views here. def login(request): error_msg='' if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') user_obj=models.User.objects.filter(username=username,password=password) if user_obj: #设置session request.session['login']='ok' #获取用户想直接访问的URL url=request.GET.get('next') #如果有,就跳转到客户初始想访问的URL if not url: #没有则默认跳转到home页面 url='/home/' return redirect(url) else: error_msg='username or password error!' return render(request,'login.html',{'error_msg':error_msg}) def home(request): return HttpResponse('<h1>这是home页面 只有登录了才能看到</h1>') def index(request): return HttpResponse('<h1>这是index页面 也只有登录了才能看到<h1>')
login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陆页面</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <form action="" method="post"> {% csrf_token %} <label for="">username:<input type="text" name="username"></label> <label for="">password:<input type="password" name="password"></label> <input type="submit" value="submit"> </form> <h1 style="color: red">{{ error_msg }}</h1> </body> </html>
middlewares.py
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect class Check_Login(MiddlewareMixin): def process_request(self,request): next_url=request.path_info if not next_url.startswith('/login/'): is_login=request.session.get('login','') if not is_login: return redirect('/login/?next={}'.format(next_url))
settings.py 注册:
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', 'middleware.my_middleware.Check_Login', ]