前言
- 优化 视图模板,让基于这个模板开发的接口,可以处理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