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

Posted alexephor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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             文件

 

以上是关于Django REST framework之解析器实例以及源码流程分析的主要内容,如果未能解决你的问题,请参考以下文章

Django rest framework ---解析器

Django Rest Framework组件:解析器JSONParserFormParserMultiPartParserFileUploadParser

Django rest-framework框架-组件之渲染器

rest framework之解析器

rest framework 之解析器

django rest framework的十个组件