Django中间件小实例


需求:利用django中间件,当普通的键值对数据进来的时候,都能通过request.data中拿到

实现:

1.在子应用下创建一个py文件,自定义一个中间件,自定义中间件需要继承MiddlewareMixin的类,
2.在该类下用process_request方法对进来的数据封装到request.data中
3.在settings.py配置文件中注册自己书写的自定义中间件

middles.py

from django.contrib.auth.middleware import AuthenticationMiddleware
from django.utils.deprecation import MiddlewareMixin
import json

class ReqData(MiddlewareMixin):
    def process_request(self, request):
        try:
            request.data = json.loads(request.body)
        except Exception as e:
            request.data = request.POST
# 这里有三种情况:
1.当提交的数据是json格式的时候,直接被request.body接收,json传的数据格式为字典格式,直接反序列化,不会捕获异常

2.当提交数据格式是urlencoded编码格式时,不是字典格式数据,捕获异常,直接将request.POST中的数据赋值给request.data,

3.如果是文件数据,也无法直接反序列化,直接跟步骤2一样,捕获异常,直接将request.POST中的数据赋值给request.data

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index)
]

views.py

from django.shortcuts import render,HttpResponse

# Create your views here.

def index(request):
    if request.method == 'POST':
        print('post的值',request.POST)
        print('body的值:',request.body)
        print('data的值:',request.data)
        return HttpResponse('ok')
    print('data的get值:',request.data)
    return render(request,'index.html')

index.html


"en">

    "UTF-8">
    Title
    {% load static %}
    
    "stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
    


"" method="post">

用户名:"text" name="username" id="id_username">

密码:"text" name="pwd" id="id_pwd">

"submit" value="提交1"> "button" value="提交" id="id_btn">