微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DRF 解析器和渲染器

一,DRF 解析器

根据请求头 content-type 选择对应的解析器就请求体内容进行处理。

1. 仅处理请求头content-type为application/json的请求体

display: none;" onclick="cnblogs_code_hide('6bbc107e-a818-4113-8e18-8a59cef44a33',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls web.views.s5_parser urlpatterns =<span style="color: #000000;"> [
url(r
<span style="color: #800000;">'
<span style="color: #800000;">test/
<span style="color: #800000;">'
,TestView.as_view(),name=<span style="color: #800000;">'
<span style="color: #800000;">test<span style="color: #800000;">'<span style="color: #000000;">),]

display: none;" onclick="cnblogs_code_hide('3d0b71ce-35c8-44f7-9f7a-1f69f1b0f6b7',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework.request rest_framework.parsers <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
parser_classes
=<span style="color: #000000;"> [JSONParser,]

</span><span style="color: #0000ff;"&gt;def</span> post(self,request,*args,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.content_type)

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>请求的值,并使用对应的JSONParser进行处理</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.data)

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.POST)
    </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.FILES)

    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;POST请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

</span><span style="color: #0000ff;"&gt;def</span> put(self,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span>)</pre>

 2. 仅处理请求头content-type为application/x-www-form-urlencoded 的请求体

display: none;" onclick="cnblogs_code_hide('84d88872-128d-4a10-842a-060cc25277e7',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls web.views urlpatterns =<span style="color: #000000;"> [
url(r
<span style="color: #800000;">'
<span style="color: #800000;">test/
<span style="color: #800000;">'
,]

<div class="cnblogs_code" onclick="cnblogs_code_show('cfbfe370-0b7c-46b0-8032-35bd8563a1e1')">
<img id="code_img_closed_cfbfe370-0b7c-46b0-8032-35bd8563a1e1" class="code_img_closed" src="/res/2019/02-14/22/1c53668bcee393edac0d7b3b3daff1ae.gif" alt=""><img id="code_img_opened_cfbfe370-0b7c-46b0-8032-35bd8563a1e1" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('cfbfe370-0b7c-46b0-8032-35bd8563a1e1',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt=""><div id="cnblogs_code_open_cfbfe370-0b7c-46b0-8032-35bd8563a1e1" class="cnblogs_code_hide">

 rest_framework.views  rest_framework.response  rest_framework.request  rest_framework.parsers <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
parser_classes
=<span style="color: #000000;"> [FormParser,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">return
Response(<span style="color: #800000;">'
<span style="color: #800000;">PUT请求,响应内容
<span style="color: #800000;">'
)

3. 仅处理请求头content-type为multipart/form-data的请求体

display: none;" onclick="cnblogs_code_hide('0970b2d2-f27c-465e-8d5d-d634270e72a5',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">

django.conf.urls

display: none;" onclick="cnblogs_code_hide('0f24f17a-9fed-4fe7-8994-540798937223',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework.request rest_framework.parsers <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
parser_classes
=<span style="color: #000000;"> [MultiPartParser,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print
<span style="color: #000000;">(request.content_type)

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>请求的值,并使用对应的JSONParser进行处理</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.data)
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.POST)
    </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.FILES)
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;POST请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

</span><span style="color: #0000ff;"&gt;def</span> put(self,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span>)</pre>
display: none;" onclick="cnblogs_code_hide('37618d0b-a686-43e8-923f-b6b3b51a9408',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
Meta Title
<span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;input </span><span style="color: #ff0000;"&gt;type</span><span style="color: #0000ff;"&gt;="submit"</span><span style="color: #ff0000;"&gt; value</span><span style="color: #0000ff;"&gt;="提交"</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">form<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>

4. 仅上传文件

display: none;" onclick="cnblogs_code_hide('cffb1311-2b7a-4e2d-b472-436213c810ee',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls web.views urlpatterns =<span style="color: #000000;"> [
url(r
<span style="color: #800000;">'
<span style="color: #800000;">test/(?P[^/]+)
<span style="color: #800000;">'
,]

display: none;" onclick="cnblogs_code_hide('def0a8ba-487e-477d-b448-fc4138db8e68',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework.request rest_framework.parsers <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
parser_classes
=<span style="color: #000000;"> [FileUploadParser,filename,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print
<span style="color: #000000;">(filename)
<span style="color: #0000ff;">print
<span style="color: #000000;">(request.content_type)

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>请求的值,并使用对应的JSONParser进行处理</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.data)
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值</span>
    <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.POST)
    </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(request.FILES)
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;POST请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

</span><span style="color: #0000ff;"&gt;def</span> put(self,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应<a href="/tag/neirong/" target="_blank" class="keywords">内容</a></span><span style="color: #800000;"&gt;'</span>)</pre>
display: none;" onclick="cnblogs_code_hide('dd8393a3-2a5f-401a-a957-7013f4b7e0ff',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
Meta Title
<span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;input </span><span style="color: #ff0000;"&gt;type</span><span style="color: #0000ff;"&gt;="submit"</span><span style="color: #ff0000;"&gt; value</span><span style="color: #0000ff;"&gt;="提交"</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">form<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>

5. 同时多个Parser

当同时使用多个parser时,rest framework会根据请求头content-type自动进行比对,并使用对应parser

display: none;" onclick="cnblogs_code_hide('52d12171-2457-432e-a2b7-c03e0d7c05b1',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls
display: none;" onclick="cnblogs_code_hide('0423cb95-f5ff-4202-9339-a5bf9163dab4',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework.request rest_framework.parsers <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
parser_classes
=<span style="color: #000000;"> [JSONParser,MultiPartParser,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">return
Response(<span style="color: #800000;">'
<span style="color: #800000;">PUT请求,响应内容
<span style="color: #800000;">'
)

6. 全局使用

display: none;" onclick="cnblogs_code_hide('b03de1f3-6a84-419d-a57a-897ed8ca8510',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
REST_FRAMEWORK = }

display: none;" onclick="cnblogs_code_hide('68f4e343-6b84-42c1-b2ff-221e83cf02a7',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls
display: none;" onclick="cnblogs_code_hide('20b2c0bd-5fda-435b-9fe3-846ec4b60177',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response <span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
<span style="color: #0000ff;">def
post(self,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">return
Response(<span style="color: #800000;">'<span style="color: #800000;">PUT请求,响应内容<span style="color: #800000;">')

注意: 个别特殊的值可以通过Django的request对象request._request来进行获取

二,DRF 渲染器

根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。用户请求URL:

  • http://127.0.0.1:8000/test/?format=json
  • http://127.0.0.1:8000/test.json

用户请求头:

  • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

1. json

访问URL:

  • http://127.0.0.1:8000/test/?format=json
  • http://127.0.0.1:8000/test.json
  • http://127.0.0.1:8000/test/ 
display: none;" onclick="cnblogs_code_hide('8d7d22a4-cc91-4d2d-ac5a-486ec3b1529c',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls web.views urlpatterns =<span style="color: #000000;"> [
url(r
<span style="color: #800000;">'
<span style="color: #800000;">^test/$
<span style="color: #800000;">'
<span style="color: #000000;">,s11_render.TestView.as_view()),url(r
<span style="color: #800000;">'<span style="color: #800000;">^test.(?P[a-z0-9]+)<span style="color: #800000;">'<span style="color: #000000;">,]

display: none;" onclick="cnblogs_code_hide('1d49ebf8-d7f1-4823-89c4-033c87bc0adb',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework <span style="color: #0000ff;">from rest_framework.renderers <span style="color: #0000ff;">import<span style="color: #000000;"> JSONRenderer

<span style="color: #0000ff;">from .. <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> TestSerializer(serializers.ModelSerializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> models.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

<span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
renderer_classes =<span style="color: #000000;"> [JSONRenderer,]

</span><span style="color: #0000ff;"&gt;def</span> get(self,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    user_list </span>=<span style="color: #000000;"&gt; models.UserInfo.objects.all()
    ser </span>= TestSerializer(instance=user_list,many=<span style="color: #000000;"&gt;True)
    </span><span style="color: #0000ff;"&gt;return</span> Response(ser.data)</pre>

2. 表格

访问URL:

  • http://127.0.0.1:8000/test/?format=admin
  • http://127.0.0.1:8000/test.admin
  • http://127.0.0.1:8000/test/ 
display: none;" onclick="cnblogs_code_hide('5a261ee3-fc66-478d-b4dc-45fdcb4e51ae',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework <span style="color: #0000ff;">from rest_framework.renderers <span style="color: #0000ff;">import<span style="color: #000000;"> AdminRenderer

<span style="color: #0000ff;">from .. <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> TestSerializer(serializers.ModelSerializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> models.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

<span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
renderer_classes =<span style="color: #000000;"> [AdminRenderer,many=<span style="color: #000000;">True)
<span style="color: #0000ff;">return Response(ser.data)

3. Form表单

访问URL:

  • http://127.0.0.1:8000/test/?format=form
  • http://127.0.0.1:8000/test.form
  • http://127.0.0.1:8000/test/ 
display: none;" onclick="cnblogs_code_hide('18601307-97f0-418e-9c88-a9112143147d',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework <span style="color: #0000ff;">from rest_framework.renderers <span style="color: #0000ff;">import<span style="color: #000000;"> JSONRenderer
<span style="color: #0000ff;">from
rest_framework.renderers <span style="color: #0000ff;">import
<span style="color: #000000;"> AdminRenderer
<span style="color: #0000ff;">from
rest_framework.renderers <span style="color: #0000ff;">import
<span style="color: #000000;"> HTMLFormRenderer

<span style="color: #0000ff;">from .. <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> TestSerializer(serializers.ModelSerializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> models.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

<span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
renderer_classes =<span style="color: #000000;"> [HTMLFormRenderer,**<span style="color: #000000;">kwargs):
user_list =<span style="color: #000000;"> models.UserInfo.objects.all().first()
ser = TestSerializer(instance=user_list,many=<span style="color: #000000;">False)
<span style="color: #0000ff;">return Response(ser.data)

4. 自定义显示模板

访问URL:

  • http://127.0.0.1:8000/test/?format=html
  • http://127.0.0.1:8000/test.html
  • http://127.0.0.1:8000/test/ 
display: none;" onclick="cnblogs_code_hide('9297d29f-014f-49c6-a687-80310c4b8a08',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
django.conf.urls
display: none;" onclick="cnblogs_code_hide('22348a15-81ff-4764-aa3e-053119590051',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework rest_framework.renderers <span style="color: #0000ff;">from .. <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> TestSerializer(serializers.ModelSerializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> models.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

<span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
renderer_classes =<span style="color: #000000;"> [TemplateHTMLRenderer,many=<span style="color: #000000;">False)
<span style="color: #0000ff;">return Response(ser.data,template_name=<span style="color: #800000;">'<span style="color: #800000;">user_detail.html<span style="color: #800000;">')

display: none;" onclick="cnblogs_code_hide('a4780fd0-7eae-42b8-a275-76d218f2bc7b',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
Meta Title

5. 浏览器格式API+JSON

访问URL:

  • http://127.0.0.1:8000/test/?format=api
  • http://127.0.0.1:8000/test.api
  • http://127.0.0.1:8000/test/ 
display: none;" onclick="cnblogs_code_hide('4b6c7d68-8701-4cd7-a6b4-e632a2d80613',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
rest_framework.views rest_framework.response rest_framework <span style="color: #0000ff;">from rest_framework.renderers <span style="color: #0000ff;">import<span style="color: #000000;"> JSONRenderer
<span style="color: #0000ff;">from
rest_framework.renderers <span style="color: #0000ff;">import
<span style="color: #000000;"> browsableAPIRenderer

<span style="color: #0000ff;">from .. <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> TestSerializer(serializers.ModelSerializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> models.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

<span style="color: #0000ff;">class<span style="color: #000000;"> CustombrowsableAPIRenderer(browsableAPIRenderer):
<span style="color: #0000ff;">def<span style="color: #000000;"> get_default_renderer(self,view):
<span style="color: #0000ff;">return<span style="color: #000000;"> JSONRenderer()

<span style="color: #0000ff;">class<span style="color: #000000;"> TestView(APIView):
renderer_classes =<span style="color: #000000;"> [CustombrowsableAPIRenderer,template_name=<span style="color: #800000;">'<span style="color: #800000;">user_detail.html<span style="color: #800000;">')

注意:如果同时多个存在时,自动根据URL后缀来选择渲染器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐