一,DRF 解析器

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

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

  1. from django.conf.urls import url, include
  2. from web.views.s5_parser import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import JSONParser
  5.  
  6. class TestView(APIView):
  7. parser_classes = [JSONParser, ]
  8.  
  9. def post(self, request, *args, **kwargs):
  10. print(request.content_type)
  11.  
  12. # 获取请求的值,并使用对应的JSONParser进行处理
  13. print(request.data)
  14.  
  15. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  16. print(request.POST)
  17. print(request.FILES)
  18.  
  19. return Response('POST请求,响应内容')
  20.  
  21. def put(self, request, *args, **kwargs):
  22. return Response('PUT请求,响应内容')

views.py

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

  1. from django.conf.urls import url, include
  2. from web.views import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import FormParser
  5.  
  6. class TestView(APIView):
  7. parser_classes = [FormParser, ]
  8.  
  9. def post(self, request, *args, **kwargs):
  10. print(request.content_type)
  11.  
  12. # 获取请求的值,并使用对应的JSONParser进行处理
  13. print(request.data)
  14.  
  15. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  16. print(request.POST)
  17. print(request.FILES)
  18.  
  19. return Response('POST请求,响应内容')
  20.  
  21. def put(self, request, *args, **kwargs):
  22. return Response('PUT请求,响应内容')

views.py

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

  1. from django.conf.urls import url, include
  2. from web.views import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import MultiPartParser
  5.  
  6. class TestView(APIView):
  7. parser_classes = [MultiPartParser, ]
  8.  
  9. def post(self, request, *args, **kwargs):
  10. print(request.content_type)
  11.  
  12. # 获取请求的值,并使用对应的JSONParser进行处理
  13. print(request.data)
  14. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  15. print(request.POST)
  16. print(request.FILES)
  17. return Response('POST请求,响应内容')
  18.  
  19. def put(self, request, *args, **kwargs):
  20. return Response('PUT请求,响应内容')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="http://127.0.0.1:8000/test/" method="post" enctype="multipart/form-data">
  9. <input type="text" name="user" />
  10. <input type="file" name="img">
  11.  
  12. <input type="submit" value="提交">
  13.  
  14. </form>
  15. </body>
  16. </html>

upload.html

4. 仅上传文件

  1. from django.conf.urls import url, include
  2. from web.views import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/(?P<filename>[^/]+)', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import FileUploadParser
  5.  
  6. class TestView(APIView):
  7. parser_classes = [FileUploadParser, ]
  8.  
  9. def post(self, request, filename, *args, **kwargs):
  10. print(filename)
  11. print(request.content_type)
  12.  
  13. # 获取请求的值,并使用对应的JSONParser进行处理
  14. print(request.data)
  15. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  16. print(request.POST)
  17. print(request.FILES)
  18. return Response('POST请求,响应内容')
  19.  
  20. def put(self, request, *args, **kwargs):
  21. return Response('PUT请求,响应内容')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="http://127.0.0.1:8000/test/f1.numbers" method="post" enctype="multipart/form-data">
  9. <input type="text" name="user" />
  10. <input type="file" name="img">
  11.  
  12. <input type="submit" value="提交">
  13.  
  14. </form>
  15. </body>
  16. </html>

upload.html

5. 同时多个Parser

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

  1. from django.conf.urls import url, include
  2. from web.views import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
  5.  
  6. class TestView(APIView):
  7. parser_classes = [JSONParser, FormParser, MultiPartParser, ]
  8.  
  9. def post(self, request, *args, **kwargs):
  10. print(request.content_type)
  11.  
  12. # 获取请求的值,并使用对应的JSONParser进行处理
  13. print(request.data)
  14. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  15. print(request.POST)
  16. print(request.FILES)
  17. return Response('POST请求,响应内容')
  18.  
  19. def put(self, request, *args, **kwargs):
  20. return Response('PUT请求,响应内容')

views.py

6. 全局使用

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PARSER_CLASSES':[
  3. 'rest_framework.parsers.JSONParser'
  4. 'rest_framework.parsers.FormParser'
  5. 'rest_framework.parsers.MultiPartParser'
  6. ]
  7.  
  8. }

settings.py

  1. from django.conf.urls import url, include
  2. from web.views import TestView
  3.  
  4. urlpatterns = [
  5. url(r'test/', TestView.as_view(), name='test'),
  6. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3.  
  4. class TestView(APIView):
  5. def post(self, request, *args, **kwargs):
  6. print(request.content_type)
  7.  
  8. # 获取请求的值,并使用对应的JSONParser进行处理
  9. print(request.data)
  10. # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
  11. print(request.POST)
  12. print(request.FILES)
  13. return Response('POST请求,响应内容')
  14.  
  15. def put(self, request, *args, **kwargs):
  16. return Response('PUT请求,响应内容')

views.py

注意: 个别特殊的值可以通过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/
  1. from django.conf.urls import url, include
  2. from web.views import s11_render
  3.  
  4. urlpatterns = [
  5. url(r'^test/$', s11_render.TestView.as_view()),
  6. url(r'^test\.(?P<format>[a-z0-9]+)', s11_render.TestView.as_view()),
  7. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4.  
  5. from rest_framework.renderers import JSONRenderer
  6.  
  7. from .. import models
  8.  
  9. class TestSerializer(serializers.ModelSerializer):
  10. class Meta:
  11. model = models.UserInfo
  12. fields = "__all__"
  13.  
  14. class TestView(APIView):
  15. renderer_classes = [JSONRenderer, ]
  16.  
  17. def get(self, request, *args, **kwargs):
  18. user_list = models.UserInfo.objects.all()
  19. ser = TestSerializer(instance=user_list, many=True)
  20. return Response(ser.data)

views.py

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/
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4.  
  5. from rest_framework.renderers import AdminRenderer
  6.  
  7. from .. import models
  8.  
  9. class TestSerializer(serializers.ModelSerializer):
  10. class Meta:
  11. model = models.UserInfo
  12. fields = "__all__"
  13.  
  14. class TestView(APIView):
  15. renderer_classes = [AdminRenderer, ]
  16.  
  17. def get(self, request, *args, **kwargs):
  18. user_list = models.UserInfo.objects.all()
  19. ser = TestSerializer(instance=user_list, many=True)
  20. return Response(ser.data)

views.py

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/
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4.  
  5. from rest_framework.renderers import JSONRenderer
  6. from rest_framework.renderers import AdminRenderer
  7. from rest_framework.renderers import HTMLFormRenderer
  8.  
  9. from .. import models
  10.  
  11. class TestSerializer(serializers.ModelSerializer):
  12. class Meta:
  13. model = models.UserInfo
  14. fields = "__all__"
  15.  
  16. class TestView(APIView):
  17. renderer_classes = [HTMLFormRenderer, ]
  18.  
  19. def get(self, request, *args, **kwargs):
  20. user_list = models.UserInfo.objects.all().first()
  21. ser = TestSerializer(instance=user_list, many=False)
  22. return Response(ser.data)

views.py

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/
  1. from django.conf.urls import url, include
  2. from web.views import s11_render
  3.  
  4. urlpatterns = [
  5. url(r'^test/$', s11_render.TestView.as_view()),
  6. url(r'^test\.(?P<format>[a-z0-9]+)', s11_render.TestView.as_view()),
  7. ]

urls.py

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4. from rest_framework.renderers import TemplateHTMLRenderer
  5.  
  6. from .. import models
  7.  
  8. class TestSerializer(serializers.ModelSerializer):
  9. class Meta:
  10. model = models.UserInfo
  11. fields = "__all__"
  12.  
  13. class TestView(APIView):
  14. renderer_classes = [TemplateHTMLRenderer, ]
  15.  
  16. def get(self, request, *args, **kwargs):
  17. user_list = models.UserInfo.objects.all().first()
  18. ser = TestSerializer(instance=user_list, many=False)
  19. return Response(ser.data, template_name='user_detail.html')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {{ user }}
  9. {{ pwd }}
  10. {{ ut }}
  11. </body>
  12. </html>

userdetail.html

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/
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4.  
  5. from rest_framework.renderers import JSONRenderer
  6. from rest_framework.renderers import BrowsableAPIRenderer
  7.  
  8. from .. import models
  9.  
  10. class TestSerializer(serializers.ModelSerializer):
  11. class Meta:
  12. model = models.UserInfo
  13. fields = "__all__"
  14.  
  15. class CustomBrowsableAPIRenderer(BrowsableAPIRenderer):
  16. def get_default_renderer(self, view):
  17. return JSONRenderer()
  18.  
  19. class TestView(APIView):
  20. renderer_classes = [CustomBrowsableAPIRenderer, ]
  21.  
  22. def get(self, request, *args, **kwargs):
  23. user_list = models.UserInfo.objects.all().first()
  24. ser = TestSerializer(instance=user_list, many=False)
  25. return Response(ser.data, template_name='user_detail.html')

views.py

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

DRF 解析器和渲染器的更多相关文章

  1. Restful API学习Day5 - DRF之限制 分页 解析器和渲染器

    参考文档: Django REST framework基础:认证.权限.限制 Django REST framework基础:分页 Django REST framework基础:解析器和渲染器 一. ...

  2. DRF 版本、认证、权限、限制、解析器和渲染器

    目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...

  3. Django-Rest-Framework的解析器和渲染器

    Django-Rest-Framework的解析器和渲染器  restful framework 解析器 解析器的作用就是服务端接收客户端传来的数据,把数据解析成自己想要的数据类型的过程 本质就是对请 ...

  4. Django REST framework - 解析器和渲染器

    目录 Django REST framework - 解析器和渲染器 解析器 Django中的数据解析 DRF中的解析器 渲染器 Django REST framework - 解析器和渲染器 解析器 ...

  5. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  6. DRF的解析器和渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

  7. DRF频率、分页、解析器、渲染器

    DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...

  8. DRF 的解析器和渲染器

    一.解析器 解析器作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentT ...

  9. 【DRF解析器和渲染器】

    目录 解析器 Django中的解析器 DRF中的解析器 DRF中的渲染器 @ *** 解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的 ...

随机推荐

  1. 使用JWT来实现对API的授权访问

    目录 什么是JWT JWT的结构 Header Payload Signature 解码后的JWT JWT是怎样工作的 在JAVA里使用JWT 引入依赖 JWT Service 生成JWT 解码JWT ...

  2. plw的骰子

    链接 [http://murphyc.fun/problem/4007] 题意 描述 duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6) 现在他投n次骰子,问投出点数和大 ...

  3. 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?

    曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...

  4. 聊一聊跨域,Vue向Django请求数据的一些问题

    1.做前后端分离 前端使用Vue程序,后端使用Django配合rest-framework. 那么前端Vue通过API接口拿到数据会出现跨域的问题,JSONP只是在get中会用到的,所以这里使用cor ...

  5. Python之缩进块

    pycharm编辑器识别冒号,当换行后下一行默认是缩进块的位置:

  6. 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...

  7. HDU 2006 求奇数的乘积

    http://acm.hdu.edu.cn/showproblem.php?pid=2006 Problem Description 给你n个整数,求他们中所有奇数的乘积.   Input 输入数据包 ...

  8. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

  9. PHP中友好的处理方式

    在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...

  10. HDU 5898 odd-even number

    题目:odd-even number 链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898 题意:给一个条件,问l 到r 之间有多少满足条件的 ...