Django Rest framework 框架之认证使用和源码执行流程
用这个框架需要先安装:
pip3 install djangorestframework
如果写了一个CBV的东西,继承了View。
# 继承Django里面View
class APIView(View):
pass # 订单View继承了APIView,相当于这个订单里面的功能就更多了。
class OrderView(APIView):
pass
restframework
from rest_framework.views import APIView
这个APIView继承View

这个View是Django里面的View

APIView多了些这么多功能

CBV的流程,URL-当前试图类-父类---dispatch

怎么加工request:

丰富了request一些功能,
authenticators是怎么来的---->调用self.get_authenticators(),self.get_authenticators()又是什么?
self.get_authenticators()应该先从,当前视图的类找,因为它里面传过去的self都是当前视图的类的对象。
没有才去父类找。它返回了个列表,列表里面有个列表生成式,如果self.authentication_classes是一个列表[Foo,Bar]里面表示两个类。对每个类进行了实例化。所以谁调用get_authenticators
返回的应该是[Foo,Bar]这个类的对象。
所以self.get_authenticators()是[Foo(),Bar()]
而self.authentication_classes是配置文件。是APIView里面的,从当前自己视图类找不到才去父类找,如果自己找到了呢?

如果自己找到了呢?
----
封装request
认证
实现认证
request.user
获取认证对象进行一步一步的认证
----
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') #如果token不存在表示没有传没有登录抛个异常
if not token:
raise exceptions.AuthenticationFailed('您没有登录') return ('zrg',None) def authenticate_header(self,val):
pass
class DogView(APIView):
# cbv请求进来 URL---> view方法 ----->dispatch方法 做路由分发 authentication_classes = [MyAuthentication,] #表示获取到的是BasicAuthentication这个类的一个对象 def get(self,request,*args,**kwargs):
# self.dispatch
# print(request) #这个request已经不是Django原来的request了。而是调用了self.initialize_request(request, *args, **kwargs)这个方法加工之后的request
# 就是Django rest framework之后的request,这里面还包含原生的request, # return Request(
# request,
# parsers=self.get_parsers(),
# authenticators=self.get_authenticators(),
# negotiator=self.get_content_negotiator(),
# parser_context=parser_context
# )
response = {
'code':1000,
'msg':'successful'
} return HttpResponse(json.dumps(response),status=202) def post(self, request, *args, **kwargs): return HttpResponse('创建dog')
认证:
如果只是用只需要写一个类,获取用户名或密码去数据库校验,如果有继续往后走,没有就报异常。
如果想应用这个认证,在试图里要加上,以后不管URL发什么请求都必须认证成功才可以往下走。
print(request.user)这个user就是‘zrg'---->返回的元组的第一个值。
源码流程:
入口就是dispatch。
Django Rest framework 框架之认证
含restframework框架的生命周期是:请求进来---》dispatch才触发。
需求:如果用Django写的接口,这个接口需要控制有的人能访问有的人不能访问!通过什么来控制?
有些API需要用户登录成功才能访问,有些无需登录就能访问。
2.用户登录返回token并保存到数据库,以后他再来访问其他需要登陆之后才能访问的页面就必须通过我的认证才能通过。
from django.shortcuts import render
from django.http import JsonResponse # Create your views here. from rest_framework.views import APIView
from api import models def md5(user):
import hashlib
import time current_time = str(time.time()) m = hashlib.md5(bytes(user,encoding='utf-8'))
m.update(bytes(current_time,encoding='utf-8')) return m.hexdigest() class AuthView(APIView): def post(self,request,*args,**kwargs): response = {
'code':1000,
'msg':'None'
} try:
user = request._request.POST.get('username')
pwd = request._request.POST.get('password') obj = models.UserInfo.objects.filter(username=user,password=pwd).first() if not obj:
response['code']=1001
response['msg']='用户名或密码错误' # 为登录用户创建token(随机字符串,md5+时间戳+当前时间+当前用户名)
token = md5(user)
# 存在更新,不存在就创建
models.UserToken.objects.update_or_create(user=obj,defaults={'token':token})
# 返回token
response['token']=token except Exception as e:
response['code']=1002
response['msg']='请求异常' return JsonResponse(response)
from api import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/auth/$', views.AuthView.as_view()),
]
1.创建了两张表。一张存用户信息,一张存用户登录成功之后的token。在视图里面我们去用户表根据他提供的用户名跟密码,为他生成token,生成token不仅给他我们还在数据库保存了一份。
from django.db import models # Create your models here. class UserInfo(models.Model):
user_type_choice = (
(1,'普通用户'),
(2,'VIP'),
(3,'SVIP'), )
user_type = models.IntegerField(choices=user_type_choice)
username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=32) class UserToken(models.Model):
user = models.OneToOneField(to='UserInfo')
token = models.CharField(max_length=64)
#可以加时间加次数表示这段token最长用多久最多可以用几次。。。。
登陆过的人才能看。怎么验证他已经登录过了?---token。
创建一个类,把这个类加到我的类中,表示我们这个类可以应用认证规则了。
restframework还支持全局配置。

Django Rest framework 框架之权限组件
只要能通过认证,就在request里面赋值。比如说有不同的用户类型,就有权限之分。
权限怎么划分?在哪里做?
问题:不同视图不同权限可以访问。
基本使用:
源码流程:
梳理:
Django Rest framework 框架之节流(用户的访问频率控制)
某个用户它访问频率,一分钟最多访问6次,超过之后提示还有多少秒可以再次访问。
需求分析:
基本使用:
源码流程:
内置的
Django Rest framework 框架之版本处理
Django Rest framework 框架之认证使用和源码执行流程的更多相关文章
- rest_framework框架之认证功能的使用和源码实现流程分析
rest_framework框架之认证的使用和源码实现流程分析 一.认证功能的源码流程 创建视图函数 Note 创建视图函数后,前端发起请求,url分配路由,执行视图类,视图类中执行对应方法必须经过d ...
- Django REST framework框架介绍和基本使用
Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...
- Django Rest Framework框架 ---- url控制器
Django Rest Framework框架 ---- url控制器
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍
web前端Vue+Django rest framework 框架 生鲜电商项目实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...
- Android 图片加载框架Picasso基本使用和源码完全解析(巨细无比)
写在之前 原本打算是每周更新一篇博文,同时记录一周的生活状态,但是稍微工作忙一点就顾不上写博客了.悲催 还是说下最近的状况,最近两周一直在接公司申请的计费点, 沃商店,银贝壳,微信等等,然后就是不停的 ...
- Django REST framework 之JWT认证
Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...
- Django Rest framework 框架
一.开发模式: 1. 普通开发方式(前后端放在一起写) 2. 前后端分离(前后台通过ajaxo交互) 后端(django rest framework写的) <----ajaxo---> ...
- Django REST framework 之 API认证
RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...
随机推荐
- UVA1442-Cav(扫描法)
Problem UVA1442-Cav Accept: 185 Submit: 679Time Limit: 3000 mSec Problem Description Input The inpu ...
- Vue2.x源码学习笔记-Vue构造函数
我们知道使用vue.js开发应用时,都是new Vue({}/*options*/) 那Vue构造函数上有哪些静态属性和方法呢?其原型上又有哪些方法呢? 一般我都会在浏览器中输入Vue来look se ...
- 面试笔记--Fast-Fail(快速失败)机制
1.解决: fail-fast机制,是一种错误检测机制.它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生.若在多线程环境下使用fail-fast机制的集合,建议使用“java. ...
- Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook
前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...
- sklearn 数据预处理1: StandardScaler
作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...
- java 基础 instance of
a instance of b a是否是b类的实例对象 返回 bool值
- hibernate(*.hbm.xml)中新添加的字段被标记为红色(找不到)的解决方法
首先得是以这个方式生成的bean和xml,配置好了数据源(这样才能让hibernate中的配置和mysql进行交互) https://www.cnblogs.com/kinome/p/10549969 ...
- Vscode更新之后rg.exe占用cpu过高
文件->首选项->搜索"search.followSymlinks"改为false https://www.zhihu.com/question/67317040
- 【原创】分布式之elk日志架构的演进
引言 好久没写分布式系列的文章了,最近刚好有个朋友给我留言,想看这方面的知识.其实这方面的知识,网上各种技术峰会的资料一抓一大把.博主也是凑合着写写.感觉自己也写不出什么新意,大家也凑合看看. 日志系 ...
- [翻译] C# 8.0 新特性
原文: Building C# 8.0 [译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"] C# 的下一个主要版本是 8.0.我们已经为它 ...