• 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.CharField(max_length=32)
     6 
     7 
     8 class UserInfo(models.Model):
     9     user_type_choices = (
    10         (1, '普通用户'),
    11         (2, 'vip'),
    12         (3, 'svip'),
    13     )
    14     user_type = models.IntegerField(choices=user_type_choices)
    15     username = models.CharField(max_length=32, unique=True)
    16     password = models.CharField(max_length=64)
    17     group = models.ForeignKey('UserGroup', on_delete=models.CASCADE)
    18     roles = models.ManyToManyField('Role')
    19 
    20 
    21 class UserToken(models.Model):
    22     user = models.OneToOneField(to='UserInfo', on_delete=models.CASCADE)
    23     token = models.CharField(max_length=64)
    24 
    25 
    26 class Role(models.Model):
    27     title = models.CharField(max_length=32)

    路由:

     1 from django.contrib import admin
     2 from django.urls import path, re_path, include
     3 
     4 urlpatterns = [
     5     path('admin/', admin.site.urls),
     6     re_path('api/', include('api.urls')),
     7 ]
     8 
     9
    10 from django.urls import path, re_path, include
    11 from api import views
    12 
    13 urlpatterns = [
    14     # 解析
    15     re_path('(?P<version>[v1|v2]+)/parser/$', views.ParserView.as_view()),
    16

    视图:

     1 from django.shortcuts import render, HttpResponse, reverse
     2 from rest_framework.views import APIView
     3 from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
     4 
     5 
     6 class ParserView(APIView):
     7     # parser_classes = [JSONParser, FormParser, MultiPartParser]
     8     """
     9     JSONParser:表示只能解析content-type:application/json头
    10     FormParser:表示只能解析content-type:application/x-www-form-urlencoded头
    11     MultiPartParser:表示只能解析content-type:multipart/form-data头
    12     """
    13 
    14     def post(self, request, *args, **kwargs):
    15         """
    16         可以发json格式数据:
    17         a.content-type:application/json b.{"name":"SB","age":18}
    18         :param request:
    19         :param args:
    20         :param kwargs:
    21         :return:
    22         """
    23         # 获取请求提交的值
    24         print(request.data)
    25         return HttpResponse('ParserView')

     全局配置:

    1 REST_FRAMEWORK = {
    2     # 解析
    3     'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'],
    4
    5 }

     解析器源码分析

    dispatch-->self.get_parsers()-->api_settings.DEFAULT_PARSER_CLASSES

     内置解析类

    BaseParser   def parse(self, stream, media_type=None, parser_context=None):

    JSONParser *************  常用

    FormParser **************  常用

    MultiPartParser *******     文件

    FileUploadParser             文件

  • 相关阅读:
    CentOS7 虚拟机搭建、初始设置、简单使用
    Oozie-4.0.0-cdh5.3.6搭建
    ionic开发环境搭建
    nodejs+chromium 创建桌面应用程序
    常用mysql笔记
    javascript 操作 css Rule
    javascript正则表达式笔记
    grunt之dev-pro环境切换
    grunt之入门实践
    动态加载js
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11306144.html
Copyright © 2020-2023  润新知