一,
当我们想做一些全局相关的功能时,比如我想做用户访问频率的校验 ------限制(同一id 一分钟只能访问五次)检验是否爬虫,——访问频率 全局
二,
用户权限,比如同时登陆 观看 但是分别有无vip 禁止/同意观看 此时也可以用中间件
是否购买 vip 其实就是在 (添加路由 添加权限)
更简单 比如 登录后才能………………
Django默认有七个中间件,并且还支持用户自定义中间件,中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
我们一直都在使用中间件,只是没有注意到而已,打开Django项目的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配置项是一个列表,而列表是有序的
而之前接触的 csrf相关中间件 之前注释掉 提交post请求时 不会被forbidden,当学习了
csrf_token 后不用再注释 csrf这个中间件了。
-------------------------------------------------
如何自定义 中间件?
1.首先要创建一个存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类 并继承
3.在类中编写五个可以自定义的方法
掌握
process_request **** (访问频率等校验)
-urls.py
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]
-Mymiddleware
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class Mymd1(MiddlewareMixin):
def process_request(self, request):
print('我是第一个自定义中间价里面的process_request方法')
return HttpResponse('我是第一个中间件返回的HttpResponse对象')
class Mymd2(MiddlewareMixin):
def process_request(self, request):
print('我是第二个自定义中间价里面的process_request方法')
-views.py
def index(request):
print('我是视图函数index')
return HttpResponse('index')
1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的方法,如果没有则直接跳过
2.如果该方法自己返回了Httpresponse对象那么不在往后执行,原路返回
process_response :
必须两个形参 而response就是要返回给你的数据
1. 响应走的时候 会从下晚上依次经过每一个注册了的 中间件里面的方法,如果没有则 直接跳过
2. 该方法有两个形参 request 和 response 形参 response指代的就是后端想要返回给前端的数据, 该方法必须放回该形参,也可以 替换(尽量不替换)
此时就有一个问题 :
porcess request(请求来时执行) process request response(请求走时执行)
请求来的时候 经过 porcess request 响应拒绝 原路返回时 该怎么走呢??
这种情况在 每个框架中 是不一样的 ;
而在Django中
经过某一个 中间件执行时 一旦发现不能够继续执行 基于当前的中间件 如果有process resquest 网上返回
如果在执行process_request方法的时候 直接返回了 HttpResponse对象 那么会原路返回执行 process_resquese 不是执行所有。。。
补充:不同于django,flask是从底部返回的响应及返回所有的process_response
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class Mymd1(MiddlewareMixin):
def process_request(self, request):
print('我是第一个自定义中间价里面的process_request方法')
# return HttpResponse('我是第一个中间件返回的HttpResponse对象')
def process_response(self, request, response):
print('我是第一个中间件里面的process_response')
return response
# 注意一定要返回形参response,该response就是后端返回给前端浏览器的响应数据
class Mymd2(MiddlewareMixin):
def process_request(self, request):
print('我是第二个自定义中间价里面的process_request方法')
def process_response(self, request, response):
print('我是第二个中间件里面的process_response')
#return response # 注意一定要返回形参response,该response就是后端返回给前端浏览器的响应数据
return HttpResponse('2020 你好啊')
________________________________________________
了解
process_view
process_template_response
_______________________________________________
因为继承的类 不知道在哪 所以 去目睹源码 抄过去到你的py文件
自己写一个类
一定要加 request形参 因为也是用来处理 网络请求
一个py文件内 可写 多个中间件
4.一定在配置文件中注册中间件 才会生效,
注册? 在你的MIDDLEWARE 输入
接下来写一个路由 urls.py
在你的 视图文件 view.py内 (记得要导入 HTTp…… render…… )
在网址中拿到了数据