扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
中间件是django的门户,在请求响应进入进出django的时候,都需要先经过中间件,用来全局改变django的输入和输出。
创新互联建站长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为青岛企业提供专业的网站建设、网站设计,青岛网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
django中自带7个中间件,每个中间件都有其特定的功能,并且django支持自定义中间件。
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中涉及到全局相关的功能,都可以利用中间件来完成,例如:
1.全局身份的校验
2.全局用户权限的校验
3.全局访问频率的校验等等
django给自定义中间件类提供了5个自定义的方法,分别是:
1.process_request
2.process_response
3.process_view
4.process_templates_response
5.process_exception
前两个必须掌握,后三个了解即可!
自定义的步骤:
1.在项目文件或者应用文件下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名字的py文件
3.在该py文件中定义一个类,该类必须继承MiddlewareMixin类
(需要导入MiddlewareMixin类,from django.utils.deprecation import MiddlewareMixin)
4.定义的类里面必须至少有一个自定义方法
5.在setting.py里面注册该中间件的路径
1.请求来的时候会经过每一个中间件的process_request方法,经过的顺序是setting.py里中间件注册的顺序从上往下
2.该方法有一个request参数
3.如果中间件里没有该方法,则直接跳过该中间件,执行下一个。
4.如果该方法中返回了HttpResponse对象,则请求将不在往下执行,直接走同级的process_response返回
(flask框架是需要走完所有的类似于proces_response方法)
5.process_request就是用来作全局相关的所有限制功能
1.响应走的时候会经过每一个中间件的process_response方法,经过的顺序是setting.py里中间件从下往下的顺序
2.该方法有两个参数request和response参数
3.该方法必须返回一个HttpResponse对象,默认是返回response,即return response;也可以自定义返回其他
4.如果中间件里没有该方法,则直接跳过该中间件,执行下一个。
process_view
路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法
顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
process_template_response
返回的HttpResponse对象有render属性的时候才会触发
顺序是按照配置文件中注册了的中间件从下往上依次经过
process_exception
当视图函数中出现异常的情况下触发
顺序是按照配置文件中注册了的中间件从下往上依次经过
要求:写一个中间件,使得每次请求来的时候,不管是urlencoded编码格式还是json编码格式传到后端的数据都变成字典格式封装到request.data里!
前端页面的搭建:
简单输入框的搭建和两种提交方式提交数据
中间件的书写:
from django.utils.deprecation import MiddlewareMixin
import json
class JsonMiddle(MiddlewareMixin):
# 请求来的时候经过这个中间件
def process_request(self,request):
try:
# 未出现异常(当前端传来的是json格式数据时),将json格式数据反序列化放入request.data中
request.data = json.loads(request.body)
except Exception as e:
# 当出现异常(前端传来的是urlencoded编码格式的数据时),也将数据交给request.data中
request.data = request.POST
# 这个不管前端是什么格式的数据,我后端request.data里的数据格式都是字典格式
# 只不过request.POST格式的字典格式是QueryDic字典格式,比平常的字典格式更强大的是不能随意删除该字典中的值,删除会保存
中间件的注册:
后端视图书写:
此时urlencoded编码格式和json格式都是在request.data中以字典形式存在
def index(request):
if request.method == 'POST':
print(request.data)
return render(request,'index.html')
注意点:
1.form表单和ajax提交有可能会重复提交,form表单中(有ajax请求)submin类型和button按钮都会触发form表单提交,input标签的button则不会触发form表单提交
2.QueryDict本身就是一个字典,但是比字典强大,不能修改值,一修改报错
3.CommonMiddleware读一下这个django中间件
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流