解析模块
为什么要配置解析模块
<code class="language-python">1)drf给我们提供了多种<a href="https://www.gaodaima.com/tag/%e8%a7%a3%e6%9e%90" title="查看更多关于解析的文章" target="_blank">解析</a>数据包方式的解析类 2)我们可以通过<a href="https://www.gaodaima.com/tag/%e9%85%8d%e7%bd%ae" title="查看更多关于配置的文章" target="_blank">配置</a>,来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析 3)全局配置就是针对每一个视图类,局部配置就是针对指定的视图类,让它们可以按照配置规则选择性解析数据 </code>
www#gaodaima.com来源gao@!dai!ma.com搞$$代^@码网搞代码
源码入口
<code class="language-python"># APIView类的dispatch方法中 <a href="https://www.gaodaima.com/tag/request" title="查看更多关于request的文章" target="_blank">request</a> = self.initialize_request(request, *args, **kwargs) # 点进去 # 获取解析类 parsers=self.get_parsers(), # 点进去 # 去类属性(局部配置) 或 配置文件(全局配置) 拿 parser_classes return [parser() for parser in self.parser_classes] </code>
自定义全局配置:settings.py
<code class="language-python">REST_FRAMEWORK = { # 全局解析配置 "DEFAULT_PARSER_CLASSES": [ "rest_framework.parsers.JSONParser", # 解析json数据包 "rest_framework.parsers.FormParser", # 解析urlencoded数据包 "rest_framework.parsers.MultiPartParser" # 解析from-data数据包 ], } </code>
自定义局部配置:应用views.py的具体视图类
<code class="language-python">from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.parsers import JSONParser,FormParser,MultiPartParser class Book(APIView): # 局部解析配置 parser_classes = [FormParser] # 只解析json数据包 def get(self, request, *args, **kwargs): ... def post(self, request, *args, **kwargs): # url拼接参数 : 只有一种传参方式,参数都在query_params print(request.query_params) # <QueryDict: {"pk": ["1"]}> # 数据包参数:有三种传参方式, # multipart/form-data | application/x-www-form-urlencoded | application/json print(request.data) # <QueryDict: {"title": ["ha"], "price": ["3.33"]}> return Response("post ok") </code>
补充:
<code class="language-python"># 禁用 json 方法传输数据包时用json传输数据则报一下错误 { "detail": "Unsupported media type "application/json" in request." } # 禁用 urlencoded 方法传输数据包时用urlencoded传输数据则报一下错误 { "detail": "Unsupported media type "application/x-www-form-urlencoded" in request." } # 禁用 form-data 方法传输数据包时用form-data传输数据则报一下错误 { "detail": "Unsupported media type "multipart/form-data; boundary=--------------------------159319842159734003915314" in request." } </code>