博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
APIView源码分析(小梅老师版本)
阅读量:6377 次
发布时间:2019-06-23

本文共 2516 字,大约阅读时间需要 8 分钟。

hot3.png

 

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

你可能感兴趣的文章
VS注释与取消注释快捷键
查看>>
深入解析Vuex实战总结
查看>>
.NET编译项目时出现《此实现不是 Windows 平台 FIPS 验证的加密算法的一部分》处理方法...
查看>>
流水落花春去也
查看>>
从.NET中委托写法的演变谈开去(下):性能相关
查看>>
C# 多人聊天程序
查看>>
【教训】为什么不作备份?!
查看>>
网搜索引擎架构设计
查看>>
iOS笔记:内存管理
查看>>
python开发_python中str.format()
查看>>
HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
查看>>
ThinkPHP3.0启动过程
查看>>
【leetcode】Longest Common Prefix (easy)
查看>>
JAX-WS(JWS)发布WebService
查看>>
Centos7安装docker-compse踩过的坑
查看>>
细说Nullable<T>类型
查看>>
oracle 插入表数据的4种方式
查看>>
7.Ajax
查看>>
Linux vi/vim编辑器常用命令与用法总结
查看>>
对于 url encode decode js 和 c# 有差异
查看>>