基于Django的Rest Framework框架的认证组件
0|1一、认证组件的作用
在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题。
- models.py
from django.db import models # Create your models here. class User(models.Model):
name = models.CharField(max_length=16)
pwd = models.CharField(max_length=16) class TokenUser(models.Model):
token = models.CharField(max_length=256)
user = models.OneToOneField(to='User',null=True,on_delete=models.SET_NULL,db_constraint=False) class Book(models.Model):
name = models.CharField(max_length=16)
price = models.IntegerField()
publish_date = models.DateField()
- myserializer.py 序列化
from rest_framework import serializers
from app01 import models class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__' def validate(self, attrs):
return attrs
0|1二、自定义版登录验证组件
- urls.py
"""blog_test URL Configuration The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01.views import BooksView, BookView,Login urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Login/$', Login.as_view()),
url(r'^Books/$', BooksView.as_view()),
url(r'^Books/(?P<pk>\d+)/$', BookView.as_view()),
]
- myauth.py 自定义验证类
from rest_framework.authentication import BaseAuthentication
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed class MyAuthentication():
#验证过程
def authenticate(self, request):
token = request.GET.get('token')
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return token_user.user,token
else:
raise AuthenticationFailed('你还未登录,请先登录') def authenticate_header(self, request):
pass
- views.py 视图类
from django.shortcuts import render
from rest_framework.response import Response # Create your views here.
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
from app01 import models
from app01.myserializer import BookSerializer
from rest_framework.views import APIView
from app01.myAuth import MyAuthentication class BooksView(ListCreateAPIView):
authentication_classes = [MyAuthentication] #加上验证的类,如果有多个,会从做到右依次验证
queryset = models.Book.objects.all()
serializer_class = BookSerializer class BookView(RetrieveUpdateDestroyAPIView):
authentication_classes = [MyAuthentication]
queryset = models.Book.objects.all()
serializer_class = BookSerializer import uuid
#登录
class Login(APIView):
def post(self,request):
name = request.data.get('name')
pwd = request.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
token = uuid.uuid4()
models.TokenUser.objects.update_or_create(user=user,defaults={"token":token})
response = {"status":100,"message":"登录成功"}
else:
response = {"status": 200, "message": "登录失败"}
return Response(response)
结果:登录后会在数据库中生成一个token,用get请求将其发送,观察各个请求的结果。
结果1:


结果2:


0|1三、继承BaseAuthentication的类的登录验证组件
- myauth.py
from rest_framework.authentication import BaseAuthentication
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed class MyAuthentication():
#验证过程
def authenticate(self, request):
token = request.GET.get('token')
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return token_user.user,token
else:
raise AuthenticationFailed('你还未登录,请先登录')
其他代码一致
0|1四、认证组件的使用方式
1.局部使用:在需要使用登录验证的视图类中写上变量 authentication_classes= [ 验证类名,]
2.全局使用:在settings.py配置文件中,加入 REST_FRAMEWORK = {‘DEFAULT_AUTHENTICATION_CLASSES’:'验证类的具体位置例如(app01.myauth.MyAuthenyicatin)'}
3.全局使用,局部禁用:在全局使用的基础上,在不需要验证的视图类中,将变量 authentication_classes 改为 [ ] 即 authentication_classes = [ ]
0|1五、认证组件源代码分析

















基于Django的Rest Framework框架的认证组件的更多相关文章
- 基于Django的Rest Framework框架的频率组件
0|1一.频率组件的作用 在我们平常浏览网站的时候会发现,一个功能你点击很多次后,系统会让你休息会在点击,这其实就是频率控制,主要作用是限制你在一定时间内提交请求的次数,减少服务器的压力. modle ...
- 基于Django的Rest Framework框架的序列化组件
本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...
- 基于Django的Rest Framework框架的视图组件
本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...
- 基于Django的Rest Framework框架的版本控制
本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 from rest_framework.v ...
- 基于Django的Rest Framework框架的RESTful规范研究
一.什么是RESTful规范 总的来说:RESTful规范就是一个非技术,人为约定的一个面向资源的架构理念. REST与技术无关,代表的是一种软件架构风格,REST是Representational ...
- 基于Django的Rest Framework框架的解析器
本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...
- 基于Django的Rest Framework框架的url控制器
本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...
- 基于Django的Rest Framework框架的响应器
本文目录 一 作用 二 内置渲染器 三 局部使用 四 全局使用 五 自定义显示模版 回到目录 一 作用 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件.用户请求URL: ht ...
随机推荐
- golang数据结构之插入排序
//InsertSort 插入排序 func InsertSort(arr *[]int) { ; i < len(arr); i++ { insertVal := (*arr)[i] inse ...
- 时间time()和$_SERVER['REQUEST_TIME']
文件ab1.php <?phpforeach($i=0;$i<1000;$i++){ echo $time();} 结果: 文件ab2.php <?php foreach($i=0; ...
- Vue ---- ajax cookies 插件安装 跨域问题 element-ui bootscript 导入
目录 补充: 流式布局样式 Django国际化配置 Django的TODO注释 Vue的ajax插件:axios 安装 配置 如何使用? Vue的cookies插件:cookies 安装: main. ...
- 前端笔记之Vue(六)分页排序|酷表单实战&Vue-cli
一.分页排序案例 后端负责提供接口(3000) 前端负责业务逻辑(8080) 接口地址:从8080跨域到3000拿数据 http://127.0.0.1:3000/shouji http://127. ...
- 2018-2-13-win10-uwp-切换主题
原文:2018-2-13-win10-uwp-切换主题 title author date CreateTime categories win10 uwp 切换主题 lindexi 2018-2-13 ...
- C# ICloneable,shallow clone,deep clone.
[Serializable] public class Person:ICloneable { public string Name { get; set; } public int Id { get ...
- AspNet Katana中Authentication有关的业务逻辑
我将从CookieAuthenticationMiddleware中间件的使用,来讲述cookie认证是如何实现的 1.系统是如何调用CookieAuthenticationMiddleware的 在 ...
- 关于Spring Boot你不得不知道的事--Spring Boot的基本操作
1 Pom文件 1.1 spring-boot-starter-parent 表示当前pom文件从spring-boot-starter-parent继承下来,在spring-boot-starter ...
- JS基础语法---循环语句之:for 循环 + 9个练习
for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...
- IP地址网段表示法
172.12.34.0/25 子网掩码:用于表示IP地址中的多少位用来做主机号.因为"其中值为1的比特留给网络号和子网号,为0的比特留给主机号"(TCP/IP V1). 172.1 ...