DRF 解析器和渲染器
一,DRF 解析器
根据请求头 content-type 选择对应的解析器就请求体内容进行处理。
1. 仅处理请求头content-type为application/json的请求体
- from django.conf.urls import url, include
- from web.views.s5_parser import TestView
- urlpatterns = [
- url(r'test/', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import JSONParser
- class TestView(APIView):
- parser_classes = [JSONParser, ]
- def post(self, request, *args, **kwargs):
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT请求,响应内容')
views.py
2. 仅处理请求头content-type为application/x-www-form-urlencoded 的请求体
- from django.conf.urls import url, include
- from web.views import TestView
- urlpatterns = [
- url(r'test/', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import FormParser
- class TestView(APIView):
- parser_classes = [FormParser, ]
- def post(self, request, *args, **kwargs):
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT请求,响应内容')
views.py
3. 仅处理请求头content-type为multipart/form-data的请求体
- from django.conf.urls import url, include
- from web.views import TestView
- urlpatterns = [
- url(r'test/', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import MultiPartParser
- class TestView(APIView):
- parser_classes = [MultiPartParser, ]
- def post(self, request, *args, **kwargs):
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT请求,响应内容')
views.py
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <form action="http://127.0.0.1:8000/test/" method="post" enctype="multipart/form-data">
- <input type="text" name="user" />
- <input type="file" name="img">
- <input type="submit" value="提交">
- </form>
- </body>
- </html>
upload.html
4. 仅上传文件
- from django.conf.urls import url, include
- from web.views import TestView
- urlpatterns = [
- url(r'test/(?P<filename>[^/]+)', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import FileUploadParser
- class TestView(APIView):
- parser_classes = [FileUploadParser, ]
- def post(self, request, filename, *args, **kwargs):
- print(filename)
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT请求,响应内容')
views.py
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <form action="http://127.0.0.1:8000/test/f1.numbers" method="post" enctype="multipart/form-data">
- <input type="text" name="user" />
- <input type="file" name="img">
- <input type="submit" value="提交">
- </form>
- </body>
- </html>
upload.html
5. 同时多个Parser
当同时使用多个parser时,rest framework会根据请求头content-type自动进行比对,并使用对应parser
- from django.conf.urls import url, include
- from web.views import TestView
- urlpatterns = [
- url(r'test/', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
- class TestView(APIView):
- parser_classes = [JSONParser, FormParser, MultiPartParser, ]
- def post(self, request, *args, **kwargs):
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT请求,响应内容')
views.py
6. 全局使用
- REST_FRAMEWORK = {
- 'DEFAULT_PARSER_CLASSES':[
- 'rest_framework.parsers.JSONParser'
- 'rest_framework.parsers.FormParser'
- 'rest_framework.parsers.MultiPartParser'
- ]
- }
settings.py
- from django.conf.urls import url, include
- from web.views import TestView
- urlpatterns = [
- url(r'test/', TestView.as_view(), name='test'),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- class TestView(APIView):
- def post(self, request, *args, **kwargs):
- print(request.content_type)
- # 获取请求的值,并使用对应的JSONParser进行处理
- print(request.data)
- # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
- print(request.POST)
- print(request.FILES)
- return Response('POST请求,响应内容')
- def put(self, request, *args, **kwargs):
- 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/
- from django.conf.urls import url, include
- from web.views import s11_render
- urlpatterns = [
- url(r'^test/$', s11_render.TestView.as_view()),
- url(r'^test\.(?P<format>[a-z0-9]+)', s11_render.TestView.as_view()),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers
- from rest_framework.renderers import JSONRenderer
- from .. import models
- class TestSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.UserInfo
- fields = "__all__"
- class TestView(APIView):
- renderer_classes = [JSONRenderer, ]
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all()
- ser = TestSerializer(instance=user_list, many=True)
- 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/
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers
- from rest_framework.renderers import AdminRenderer
- from .. import models
- class TestSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.UserInfo
- fields = "__all__"
- class TestView(APIView):
- renderer_classes = [AdminRenderer, ]
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all()
- ser = TestSerializer(instance=user_list, many=True)
- 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/
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers
- from rest_framework.renderers import JSONRenderer
- from rest_framework.renderers import AdminRenderer
- from rest_framework.renderers import HTMLFormRenderer
- from .. import models
- class TestSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.UserInfo
- fields = "__all__"
- class TestView(APIView):
- renderer_classes = [HTMLFormRenderer, ]
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all().first()
- ser = TestSerializer(instance=user_list, many=False)
- 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/
- from django.conf.urls import url, include
- from web.views import s11_render
- urlpatterns = [
- url(r'^test/$', s11_render.TestView.as_view()),
- url(r'^test\.(?P<format>[a-z0-9]+)', s11_render.TestView.as_view()),
- ]
urls.py
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers
- from rest_framework.renderers import TemplateHTMLRenderer
- from .. import models
- class TestSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.UserInfo
- fields = "__all__"
- class TestView(APIView):
- renderer_classes = [TemplateHTMLRenderer, ]
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all().first()
- ser = TestSerializer(instance=user_list, many=False)
- return Response(ser.data, template_name='user_detail.html')
views.py
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- {{ user }}
- {{ pwd }}
- {{ ut }}
- </body>
- </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/
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers
- from rest_framework.renderers import JSONRenderer
- from rest_framework.renderers import BrowsableAPIRenderer
- from .. import models
- class TestSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.UserInfo
- fields = "__all__"
- class CustomBrowsableAPIRenderer(BrowsableAPIRenderer):
- def get_default_renderer(self, view):
- return JSONRenderer()
- class TestView(APIView):
- renderer_classes = [CustomBrowsableAPIRenderer, ]
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all().first()
- ser = TestSerializer(instance=user_list, many=False)
- return Response(ser.data, template_name='user_detail.html')
views.py
注意:如果同时多个存在时,自动根据URL后缀来选择渲染器。
DRF 解析器和渲染器的更多相关文章
- Restful API学习Day5 - DRF之限制 分页 解析器和渲染器
参考文档: Django REST framework基础:认证.权限.限制 Django REST framework基础:分页 Django REST framework基础:解析器和渲染器 一. ...
- DRF 版本、认证、权限、限制、解析器和渲染器
目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...
- Django-Rest-Framework的解析器和渲染器
Django-Rest-Framework的解析器和渲染器 restful framework 解析器 解析器的作用就是服务端接收客户端传来的数据,把数据解析成自己想要的数据类型的过程 本质就是对请 ...
- Django REST framework - 解析器和渲染器
目录 Django REST framework - 解析器和渲染器 解析器 Django中的数据解析 DRF中的解析器 渲染器 Django REST framework - 解析器和渲染器 解析器 ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- DRF的解析器和渲染器
解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...
- DRF频率、分页、解析器、渲染器
DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...
- DRF 的解析器和渲染器
一.解析器 解析器作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentT ...
- 【DRF解析器和渲染器】
目录 解析器 Django中的解析器 DRF中的解析器 DRF中的渲染器 @ *** 解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的 ...
随机推荐
- 使用JWT来实现对API的授权访问
目录 什么是JWT JWT的结构 Header Payload Signature 解码后的JWT JWT是怎样工作的 在JAVA里使用JWT 引入依赖 JWT Service 生成JWT 解码JWT ...
- plw的骰子
链接 [http://murphyc.fun/problem/4007] 题意 描述 duxing2016有一个神奇的骰子,投出1-6的概率为(p1,p2...p6) 现在他投n次骰子,问投出点数和大 ...
- 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...
- 聊一聊跨域,Vue向Django请求数据的一些问题
1.做前后端分离 前端使用Vue程序,后端使用Django配合rest-framework. 那么前端Vue通过API接口拿到数据会出现跨域的问题,JSONP只是在get中会用到的,所以这里使用cor ...
- Python之缩进块
pycharm编辑器识别冒号,当换行后下一行默认是缩进块的位置:
- 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter
[学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...
- HDU 2006 求奇数的乘积
http://acm.hdu.edu.cn/showproblem.php?pid=2006 Problem Description 给你n个整数,求他们中所有奇数的乘积. Input 输入数据包 ...
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- PHP中友好的处理方式
在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...
- HDU 5898 odd-even number
题目:odd-even number 链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898 题意:给一个条件,问l 到r 之间有多少满足条件的 ...