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"]
    }
    

    这个解析器好简单啊

  • 相关阅读:
    Java 递归算法,遍历文件夹下的所有文件。
    基于appium的移动端自动化测试,密码键盘无法识别问题
    第一个脚印
    最简单ajax,$.post()用法
    关于图片title与alt
    iframe loading 效果
    iframe 跨域的高度自适应
    练习卷动式新闻广告牌
    JS学习笔记《数值与字符串相加篇》
    解决FLASH的层级问题
  • 原文地址:https://www.cnblogs.com/wanstack/p/9884292.html
Copyright © 2011-2022 走看看