zoukankan      html  css  js  c++  java
  • 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)views.py

    from rest_framework.parsers import JSONParser,FormParser
    
    class PaserView(APIView):
    
        parser_classes = [JSONParser,FormParser,]
        #JSONParser:表示只能解析content-type:application/json的头
        #FormParser:表示只能解析content-type:application/x-www-form-urlencoded的头
    
        def post(self,request,*args,**kwargs):
            #获取解析后的结果
            print(request.data)
            return HttpResponse('paser')
    

      

    (3)通过postman发送Json数据

    在后台可以获取发过来的Json数据

    源码流程

     (1)dispatch

    def dispatch(self, request, *args, **kwargs):
            """
            `.dispatch()` is pretty much the same as Django's regular dispatch,
            but with extra hooks for startup, finalize, and exception handling.
            """
            self.args = args
            self.kwargs = kwargs
            #对原始request进行加工,丰富了一些功能
            #Request(
            #     request,
            #     parsers=self.get_parsers(),
            #     authenticators=self.get_authenticators(),
            #     negotiator=self.get_content_negotiator(),
            #     parser_context=parser_context
            # )
            #request(原始request,[BasicAuthentications对象,])
            #获取原生request,request._request
            #获取认证类的对象,request.authticators
            #1.封装request
            request = self.initialize_request(request, *args, **kwargs)
            self.request = request
            self.headers = self.default_response_headers  # deprecate?
    
            try:
                #2.认证
                self.initial(request, *args, **kwargs)
    
                # Get the appropriate handler method
                if request.method.lower() in self.http_method_names:
                    handler = getattr(self, request.method.lower(),
                                      self.http_method_not_allowed)
                else:
                    handler = self.http_method_not_allowed
    
                response = handler(request, *args, **kwargs)
    
            except Exception as exc:
                response = self.handle_exception(exc)
    
            self.response = self.finalize_response(request, response, *args, **kwargs)
            return self.response
    

      

    (2)initialize_request

    获取所有解析器

    def initialize_request(self, request, *args, **kwargs):
            """
            Returns the initial request object.
            """
            parser_context = self.get_parser_context(request)
    
            return Request(
                request,
                parsers=self.get_parsers(),                  #获取所有的解析器
                authenticators=self.get_authenticators(),    #[BasicAuthentication(),],把所有的认证类对象封装到request里面了
                negotiator=self.get_content_negotiator(),
                parser_context=parser_context
            )
    

      

    (3)get_parsers

        def get_parsers(self):
            """
            Instantiates and returns the list of parsers that this view can use.
            """
            return [parser() for parser in self.parser_classes]
    

      

    (4)parser_classes

     同样我们可以在settings里面全局配置

    #全局配置
    REST_FRAMEWORK = {
        #版本
        "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",   
        #解析器
        "DEFAULT_PARSER_CLASSES":["rest_framework.parsers.JSONParser","rest_framework.parsers.FormParser"]
    }
    

    这个解析器好简单啊

  • 相关阅读:
    python,生产环境安装
    neo4j 图数据库
    RNN系列
    机器学习关于AUC的理解整理
    fensorflow 安装报错 DEPENDENCY ERROR
    dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
    使用hbase遇到的问题
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
    gradle 安装
    jenkins 安装遇到的坑
  • 原文地址:https://www.cnblogs.com/wanstack/p/9884292.html
Copyright © 2011-2022 走看看