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

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/XLHIT/p/11630039.html
Copyright © 2011-2022 走看看