前言

  • 优化 视图模板,让基于这个模板开发的接口,可以处理content-type为json的请求

    1、视图模板存在的问题

    前面的基于视图模板开发的接口有一个问题:
    请求消息主体是序列化后的 JSON 字符串(即content-type为’application/json时,视图的request对象不能拿到请求消息主体的内容,如下所示。
    这是因为request对象的 GET/POST 属性,不能获取 content-type为’application/json‘的请求数据;
    需要用 request 对象的 body 属性,来获取。参考本知识库
    image.png

    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):

  1. # 执行路由之前被调用,在每个请求上调用
  2. if "json" in request.content_type and request.method in ["POST","PUT"]:
  3. # 如果请求消息主体 包含json 且 请求方法是"POST"或"PUT"
  4. try:
  5. data = json.loads(request.body)
  6. # 尝试把这个请求体转为字典
  7. except:
  8. return ThzResponse(-1,"json格式不正确")
  9. # 转换为字典出错,说明请求体的JSON格式是不正确的
  10. setattr(request,request.method.upper(),data)
  11. # 转换成功,重新设置request对象的 POST或者PUT属性 为转换后的字典(JSON转字典)
  1. <a name="LaJx5"></a>
  2. ## 2.2、注册这个中间件
  3. 在项目同名文件夹下的**settings.py**配置文件中,注册这个中间件
  4. ```python
  5. # 用于注册中间件
  6. MIDDLEWARE = [
  7. 'django.middleware.security.SecurityMiddleware',
  8. 'django.contrib.sessions.middleware.SessionMiddleware',
  9. 'django.middleware.common.CommonMiddleware',
  10. # 'django.middleware.csrf.CsrfViewMiddleware',
  11. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  12. 'django.contrib.messages.middleware.MessageMiddleware',
  13. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  14. # 'user.middle_wares.ArticleMiddleWare', # 注册我们自定义的中间件
  15. # 'middleware.mymiddleware.MyMiddleWare1', # 注册我们自定义的中间件
  16. # 'middleware.mymiddleware.MyMiddleWare2' # 注册我们自定义的中间件
  17. # 'my_user.middleware.MyUserMW', # 注册的用于校验登录token的中间件
  18. 'middleware.process_put_middleware.PutMiddleware', # 注册 put请求处理的中间件
  19. 'middleware.json_middleware.JsonMiddleWare' ,
  20. # 注册 处理请求消息主体是JSON类型的中间件
  21. ]

2.3、验证

image.png

3、参考博客

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