加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

DRF 解析器和渲染器

发布时间:2020-12-15 17:17:59 所属栏目:大数据 来源:网络整理
导读:一,DRF 解析器 根据请求头 content-type 选择对应的解析器就请求体内容进行处理。 1. 仅处理请求头content-type为application/json的请求体 django.conf.urls web.views.s5_parser urlpatterns =span style="color: #000000;" [ url(r span style="color: #

一,DRF 解析器

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

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

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;">),]

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;kwargs):
    </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; 获取请求的值,并使用对应的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请求,响应内容</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;kwargs):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应内容</span><span style="color: #800000;"&gt;'</span>)</pre>

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

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="https://www.52php.cn/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="https://www.52php.cn/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的请求体

django.conf.urls

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; 获取请求的值,并使用对应的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请求,响应内容</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;kwargs):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应内容</span><span style="color: #800000;"&gt;'</span>)</pre>
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. 仅上传文件

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;">'
,]

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; 获取请求的值,并使用对应的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请求,响应内容</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;kwargs):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;PUT请求,响应内容</span><span style="color: #800000;"&gt;'</span>)</pre>
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

django.conf.urls
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. 全局使用

REST_FRAMEWORK = }

django.conf.urls
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/?
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;">,]

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;kwargs):
    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/?
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/?
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/?
django.conf.urls
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;">')

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/?
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后缀来选择渲染器。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读