rest-framework解析器

解析器

1.json解析器

发一个json格式的post请求。后台打印:
request_data---> {‘title‘: ‘北京折叠‘}
request.POST---> <QueryDict: {}>

2.urlencode解析器

request_data---> <QueryDict: {‘title‘: [‘北京‘], ‘price‘: [‘122‘]}>
request.POST---> <QueryDict: {‘title‘: [‘北京‘], ‘price‘: [‘122‘]}>

rest-framework默认支持的有3种解析器,json,form,文件上传。而Django原生只支持form的解析,不支持json的解析。

源码:

JSON解析器类:

class JSONParser(BaseParser):
    """
    Parses JSON-serialized data.
    """
    media_type = ‘application/json‘
    renderer_class = renderers.JSONRenderer
    strict = api_settings.STRICT_JSON

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as JSON and returns the resulting data.
        """
        parser_context = parser_context or {}
        encoding = parser_context.get(‘encoding‘, settings.DEFAULT_CHARSET)

        try:
            decoded_stream = codecs.getreader(encoding)(stream)
            parse_constant = json.strict_constant if self.strict else None
            return json.load(decoded_stream, parse_constant=parse_constant)
        except ValueError as exc:
            raise ParseError(‘JSON parse error - %s‘ % six.text_type(exc))

form解析器类:

class FormParser(BaseParser):
    """
    Parser for form data.
    """
    media_type = ‘application/x-www-form-urlencoded‘

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as a URL encoded form,
        and returns the resulting QueryDict.
        """
        parser_context = parser_context or {}
        encoding = parser_context.get(‘encoding‘, settings.DEFAULT_CHARSET)
        data = QueryDict(stream.read(), encoding=encoding)
        return data
        

文件上传类:

class MultiPartParser(BaseParser):
    """
    Parser for multipart form data, which may include file data.
    """
    media_type = ‘multipart/form-data‘

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as a multipart encoded form,
        and returns a DataAndFiles object.

        `.data` will be a `QueryDict` containing all the form parameters.
        `.files` will be a `QueryDict` containing all the form files.
        """
        parser_context = parser_context or {}
        request = parser_context[‘request‘]
        encoding = parser_context.get(‘encoding‘, settings.DEFAULT_CHARSET)
        meta = request.META.copy()
        meta[‘CONTENT_TYPE‘] = media_type
        upload_handlers = request.upload_handlers

        try:
            parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding)
            data, files = parser.parse()
            return DataAndFiles(data, files)
        except MultiPartParserError as exc:
            raise ParseError(‘Multipart form parse error - %s‘ % six.text_type(exc))

URL控制

1.因为每次url都需要写下面的2条线,导致代码冗余。

 # url(r‘authors/$‘, views.AuthorModelView.as_view({"get":"list","post":"create"}),name="authors"),
 # url(r‘authors/(?P<pk>\d+)/$‘, views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="authordetail"),

2.使用rest-framework提供的:

from django.conf.urls import url,include
from app01 import views

from rest_framework import routers
routers=routers.DefaultRouter()
routers.register("authors",views.AuthorModelView)

url中需要加这一句即可:

url(r‘‘,include(routers.urls)),

以后每一个表,注册一下即可,前面的是url的前缀,后面是对应的视图类。

分页

原文地址:https://www.cnblogs.com/geogre123/p/9750057.html

时间: 2024-08-29 11:37:56

rest-framework解析器的相关文章

django rest framework 解析器组件 接口设计,视图组件 (1)

一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.data触发 二.序列化组件 2.1.django 自带组件serializer 2.1.1 from django.serializers import serialize2.1.2 origin_data = Book.objects.all()2.1.3 serialized_data = se

9.6 rest framework 解析器,渲染器

解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 请求体相关字段: Accept:指定了接收的数据类型 ContentType:指定了传递的数据类型 解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据. ps: django 原生是不支持 json 类型的数据,数据通过request.get 是拿不到的,只能在 request.body

Django REST Framework 解析器与渲染器

01-解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型. 注意: 开发客户端应用程序时应该始终记住在HTTP请求中发送数据时确保设置Content-Type头. 如果你不设置内容类型,大多数客户端将默认使用'application/x-www-form-urlencoded',而这可能并不是你想要的. 举个例子,如果你使用jQuery的.ajax() 方法发送json编码数据,你应该确保包含c

rest framework 之解析器

一.示例 1.api/urls.py from django.urls import path, re_path from api.views import UserView, ParserView urlpatterns = [ # path('users/', UserView.as_view()), re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(), name='api_user'), path('parser/', P

rest framework之解析器

一.内置解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,解析器用于解析客户端提交的数据. 内置解析器的使用 1.全局设置 可以使用 DEFAULT_PARSER_CLASSES 设置默认的全局解析器.例如,以下设置将只允许带有 JSON 内容的请求,而不是默认的 JSON 或表单数据. REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ( 'rest_framework.parsers.JSO

Django Restful Framework【第四篇】版本、解析器、序列化和请求数据验证

一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class UserView(APIView): def get(self,request,*args,**kwargs): version = request.query_params.get('version') print(version) if version=='v1': #如果版本是v1 ret = { 'code':111, 'msg':'版本一的内容'

Django rest framework(5)----解析器

解析器前戏 有时候我们在接受前端传送的值的时候,会存在这样一个奇怪的现象使用request.body可以取到值,而使用request.POST的时候去不到值,基于这样的情况,究竟是如何造成的呢? 追了以下源码发现  把request.body  中的值转换成 POST 需要满足以下的两个条件,也就是说必须满足以下两个条件,才可以使用request.POST接受值,否则只能使用request.body 1. 请求头要求: Content-Type: application/x-www-form-u

Django Rest Framework之解析器

基本代码结构 urls.py: from django.conf.urls import url, include from web.views.s5_parser import TestView urlpatterns = [ url(r'test/', TestView.as_view(), name='test'), ] views.py: from rest_framework.views import APIView from rest_framework.response impor

Django REST framework之解析器实例以及源码流程分析

解析器 我们都知道源生Django默认只能解析content-type:application/x-www-form-urlencoded头格式的,若果是json格式,form-data格式都要自己处理. 但是在restframework已经为我们做好了,只要配置上,就能帮我们解析请求的数据 举例说明: 表设计: 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharFie

Django rest framework(5) ---解析器

(1)api/urls.py # api/urls.py from django.urls import path,re_path from .views import UserView,PaserView urlpatterns = [ re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'), path('paser/', PaserView.as_view(),), #解析 ] (2)vie