在看源码之前先了解一下什么是rest,restful api.

什么是rest

可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则。 REST是Representational State Transfer的简称,中文翻译为“表征状态转移”.

restful api

符合REST架构设计的API。

restful api的书写规范:

- URL(在url中表现出来它是一个api)
- url名词(url应当是名词)
- 版本 (在url中表明版本号)
- 提交方式(提交方式最为重要,根据提交方式的不同来判断要执行什么样的操作)
- status(返回的状态码)
- Hypermedia link(在api中返回链接)
- 错误详细(状态码是4xx时,应返回错误信息,error当做key。)

下面就来看看它源码中的流程

from django.urls import path, re_path
from xfzapp import views

urlpatterns = [
    re_path('login/$', views.LoginView.as_view()),
    re_path('courses/$', views.CourseView.as_view()),
]

login对应的视图类LoginView

# Django内置
from django.shortcuts import render, HttpResponse
# 第三方
from rest_framework.views import APIView

class LoginView(APIView):
    print('进来了吗?')
    # parser_classes = [FormParser]
    def get(self, request):
        print('这里是GET下面')
        return render(request, 'login.html')

    def post(self, request):
        print('这里是POST下面')
        ret = request.data
        print(ret)
        return HttpResponse("Ok")

第一步,请求刚进来会执行对应类中的dispathch()方法,若当前类中没有,就去它的父类APIView中找。

    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类的一个实例对象,initialize_request方法对原来的request进行了封装

        request = self.initialize_request(request, *args, **kwargs)
        # 封装好的request赋值给类本身的request
        self.request = request
        self.headers = self.default_response_headers  # deprecate?

        try:
            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

 

第二步,它又调用了initialize_request并将它的返回值重新赋值给了request。说明现在的request就不是django原来的request了,然后我们点进去它里面都做了些什么。

在initialize_request方法中,又重新封装了request对象,在原来的基础上又重新封装了一些东西,现在我们来看看get_authenticators()中到底做了什么

在get_authenticators这个方法中循环了self.authentication_classes返回了一个列表对象,因为他是self.找的,所有它先去我们写的那个类中去找authentication_classes,我们

写的类中没有才去父类中找,因此我们就可以自定义这个列表类了。在定义之前要知道它默认的类中都有什么,我们才会好根据它默认的类去定义。

由此可以看出它默认的authentication_classes是从它的配置文件中读出来的。现在就可以去看看它配置文件中的类了。

现在就可以去看看这两个类中都有什么方法。

可以看出他们都继承了一个BaseAuthentication的类并且都实现了authenticate方法。所以现在我们去看看BaseAuthentication类到底是什么?

由此可以看出BaseAuthentication类其实是一个接口类,让继承它的类必须实现authenticate方法。

最后就是在request对象中的authenticatotes中封装了一些关于认证的对象,然后我们接着往下看

然后又执行initial这个方法。