APIView源码分析(小梅老师版本)

 

APIView源码:django

1.APIView继承了Viewjson

原生viewpost

 二、APIView类里面有dispatch方法url

三、 APIView在原有的基础上,多了不少功能。request:进行了加工,是一个新的对象。spa

 

4.请求封装request = self.initialize_request(request, *args, **kwargs)(版本、认证、权限、节流、解析器)3d

5.认证rest

 

6.若是本身写了用户认证,就找本身的认证方法:code

 

 

7.加注释、initialorm

8.initial对象

9.认证   

10.request是封装后的对象了,全部user应该去APIView里面找。

11._authenticate  # 循环认证类的全部对象 [BasicAuthentication对象,]

 

 .authenticate方法检查你是否已登入。若是用户没有登入则报错。

12.接下来本身定义一个认证方法:必须有authenticate方法:若是用户没有登入,则报错。

 

运行结果:url没有传token值,则认证失败

url传了token,认证成功

 

13.认证流程加注释  

0.url.as_view  -》 1.self.dispatch   

self.dispatch

 2.initial(版本、认证、权限、节流、解析器)

 

3.perform_authentication 实现认证

4. from rest_framework.request import Request  方便查询user

5.获取认证对象,进行一步步的认证

 

 认证流程:view -> dispach -> 封装Request -> initial:(版本、认证、权限、节流、解析器)-> perform_authentication 实现认证 -user -> authenticate方法

 

若是认证成功有(token值),request.user则有值。

 

 

认证代码:

复制代码

a. 认证 
            - 仅使用:
                    from django.views import View
                    from rest_framework.views import APIView
                    from rest_framework.authentication import BasicAuthentication
                    from rest_framework import exceptions
                    from rest_framework.request import Request

                    class MyAuthentication(object):
                        def authenticate(self,request):
                            token = request._request.GET.get('token')
                            # 获取用户名和密码,去数据校验
                            if not token:
                                raise exceptions.AuthenticationFailed('用户认证失败')
                            return ("alex",None)

                        def authenticate_header(self,val):
                            pass

                    class DogView(APIView):
                        authentication_classes = [MyAuthentication,]

                        def get(self,request,*args,**kwargs):
                            print(request)
                            print(request.user)
                            ret  = {
                                'code':1000,
                                'msg':'xxx'
                            }
                            return HttpResponse(json.dumps(ret),status=201)

                        def post(self,request,*args,**kwargs):
                            return HttpResponse('建立Dog')

                        def put(self,request,*args,**kwargs):
                            return HttpResponse('更新Dog')

                        def delete(self,request,*args,**kwargs):
                            return HttpResponse('删除Dog')
相关文章
相关标签/搜索