前言
- 优化 视图模板,让基于这个模板开发的接口,可以处理content-type为json的请求
1、视图模板存在的问题
前面的基于视图模板开发的接口有一个问题:
在请求消息主体是序列化后的 JSON 字符串(即content-type为’application/json‘)时,视图的request对象不能拿到请求消息主体的内容,如下所示。
这是因为request对象的 GET/POST 属性,不能获取 content-type为’application/json‘的请求数据;
需要用 request 对象的 body 属性,来获取。参考本知识库
2、解决问题
2.1、定义处理请求消息主体是JSON字符串的中间件
```python from django.middleware.common import MiddlewareMixin from common.utils import ThzResponse # 导入优化后的JsonResponse import json
class JsonMiddleWare(MiddlewareMixin): “”” 处理请求消息主体是JSON字符串的中间件 将JSON类型转换为dict类型 “”” def process_request(self,request):
# 执行路由之前被调用,在每个请求上调用if "json" in request.content_type and request.method in ["POST","PUT"]:# 如果请求消息主体 包含json 且 请求方法是"POST"或"PUT"try:data = json.loads(request.body)# 尝试把这个请求体转为字典except:return ThzResponse(-1,"json格式不正确")# 转换为字典出错,说明请求体的JSON格式是不正确的setattr(request,request.method.upper(),data)# 转换成功,重新设置request对象的 POST或者PUT属性 为转换后的字典(JSON转字典)
<a name="LaJx5"></a>## 2.2、注册这个中间件在项目同名文件夹下的**settings.py**配置文件中,注册这个中间件```python# 用于注册中间件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',# 'user.middle_wares.ArticleMiddleWare', # 注册我们自定义的中间件# 'middleware.mymiddleware.MyMiddleWare1', # 注册我们自定义的中间件# 'middleware.mymiddleware.MyMiddleWare2' # 注册我们自定义的中间件# 'my_user.middleware.MyUserMW', # 注册的用于校验登录token的中间件'middleware.process_put_middleware.PutMiddleware', # 注册 put请求处理的中间件'middleware.json_middleware.JsonMiddleWare' ,# 注册 处理请求消息主体是JSON类型的中间件]
2.3、验证

3、参考博客
简书:关于Content-Type几种值的区别及用法
https://www.jianshu.com/p/2ac9297e00f9
