美文网首页
DRF部分源码解析之APIView

DRF部分源码解析之APIView

作者: 清风徐来_简 | 来源:发表于2019-05-26 11:21 被阅读0次

Django RestFramework (DRF)基于django框架开发的(pip install restframework),常用的功能有【解析认证序列化视图组分页】等,接下来就从APIView入手,看一下这几个功能。

import json
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from .models import Course


class CourseView(APIView):
    def get(self, request):
        course_list = Course.objects.all()
        ret = []
        for course in course_list:
            ret.append({
                "title": course.title,
                "desc": course.desc,
            })
        return HttpResponse(json.dumps(ret, ensure_ascii=False))

    def post(self, request):
        print(request.data)  # 新的request中有一个data属性
        return HttpResponse("POST")
APIView的作用 (以下链接):
  • 1,自定义的CBV在url中,调用了as_view()方法。但是自己的类里没有此方法,所以找父类里的APIView

  • 2,APIView里有此方法,但是是执行了父类View 的 as_view方法,并且返回了view 函数,加上了几个属性

    @classmethod
    def as_view(cls, **initkwargs):
        view = super(APIView, cls).as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs
        return csrf_exempt(view)
    
  • 3,请求到来,执行view 函数,返回dispatch的执行结果,一定要认清self.dispatch中的self是谁,是自定义的类的实例对象

    def view(request, *args, **kwargs):
        self = cls(**initkwargs)
        return self.dispatch(request, *args, **kwargs)
    
  • 4,自定义的类中没有此dispatch方法,所以找父类APIView中的方法,有此方法,所以,这个dispatch用的是APIView 中的 dispatch方法,有以下功能

  • 5,APIView中的dispatch

    def dispatch(self, request, *args, **kwargs):
            【1】重新封装request对象,之后再用request都是新的,有了request.data属性
            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
                      【3】最后还是返回了反射后的执行结果,此部分和View中的方法一样
                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
    

相关文章

网友评论

      本文标题:DRF部分源码解析之APIView

      本文链接:https://www.haomeiwen.com/subject/zhsxtctx.html