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

 

APIView源码:

1.APIView继承了View

原生view

 2、APIView类里面有dispatch方法

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

 

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

5.认证

 

6.如果自己写了用户认证,就找自己的认证方法:

 

 

7.加注释、initial

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')

转载于:https://my.oschina.net/u/3648651/blog/1839434

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值