

DRF的认证组件(源码分析) - huxiaofeng
source link: https://www.cnblogs.com/huxiaofeng1029/p/17339601.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

DRF认证组件(源码分析)
1. 数据库建立用户表
在drf中也给我们提供了 认证组件 ,帮助我们快速实现认证相关的功能,例如:
# models.py
from django.db import models
class UserInfo(models.Model):
username = models.CharField(verbose_name="用户名", max_length=32)
password = models.CharField(verbose_name="密码", max_length=64)
token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
2. 自定义认证类
定义一个认证的类并继承BaseAuthentication
# -*- encoding:utf-8 -*-
# @time: 2023/4/21 8:44
# @author: ifeng
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app01 import models
# 用户认证
class TokenAuthentication(BaseAuthentication):
def authenticate(self, request):
token = request.query_params.get('token')
if not token:
raise AuthenticationFailed({'code': 1002, 'error': '认证失败'})
user_obj = models.UserInfo.objects.filter(token=token).first()
if not user_obj:
raise AuthenticationFailed({'code': 1001, 'error': '认证失败'})
return user_obj, token
def authenticate_header(self, request):
return 'Bearer realm="API"'
3. 视图函数中添加认证
from rest_framework.response import Response
from rest_framework.views import APIView
from .auth import TokenAuthentication # 导入认证类
from app01 import models
# Create your views here.
class UserView(APIView):
authentication_classes = [TokenAuthentication, ] # token认证
def get(self, request, *args, **kwargs):
# 用户认证
print(request.user, request.auth)
return Response({'code': 0, 'data': '嘻嘻嘻哈啊哈哈'})
def post(self, request, *args, **kwargs):
pass
4. 关于返回None
接下来说说 “返回None” 是咋回事。
在视图类的
authentication_classes
中定义认证类时,传入的是一个列表,支持定义多个认证类。当出现多个认证类时,drf内部会按照列表的顺序,逐一执行认证类的
authenticate
方法,如果 返回元组 或 抛出异常 则会终止后续认证类的执行;如果返回None,则意味着继续执行后续的认证类。如果所有的认证类
authenticate
都返回了None,则默认 request.user="AnonymousUser" 和 request.auth=None,也可以通过修改配置文件来修改默认值。REST_FRAMEWORK = { "UNAUTHENTICATED_USER": lambda: None, "UNAUTHENTICATED_TOKEN": lambda: None, }
应用场景
:
当某个API,已认证 和 未认证 的用户都可以访问时,比如:
- 已认证用户,访问API返回该用户的视频播放记录列表。
- 未认证用户,访问API返回最新的的视频列表。
注意:不同于之前的案例,之前案例是:必须认证成功后才能访问,而此案例则是已认证和未认证均可访问。
5. 关于返回多个认证类
当项目中可能存在多种认证方式时,就可以写多个认证类。例如,项目认证支持:
- 在请求中传递token进行验证。
- 请求携带cookie进行验证。
class UserView(APIView):
authentication_classes = [TokenAuthentication, CookieAuthentication] # token认证
6. 全局配置
在每个视图类的类变量 authentication_classes
中可以定义,其实在配置文件中也可以进行全局配置,例如:
REST_FRAMEWORK = {
# 认证
"UNAUTHENTICATED_USER": lambda: None, # 如果每一个认证最后都返回None. 就会调用到这个
"UNAUTHENTICATED_TOKEN": lambda: None,
'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.TokenAuthentication', ]
}
7. 源码分析
序号为执行流程

Recommend
-
27
作者: HelloGitHub-追梦人物 API 不可能一成不变,无论是新增或者删除已有 API,都会对调...
-
8
DRF 视图组件
-
7
DRF JWT认证(一)
-
10
组合搜索组件 1. 先展示一下使用效果: ...
-
5
DRF中版本控制的五种情况(源码分析) 在restful规范中要去,后端的API中需要体现版本。 drf框架中支持5种版本的设置。 1. URL的GET参数传递(*) 示例: user/?v...
-
9
Django的Message组件(源码分析) # MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage' # MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage' MESSAGE_STOR...
-
5
项目部署上线 想要将django项目部署在服务器上,本质上需要三大部分...
-
10
git上传对象文件错误解决方案 时隔一个星期, 当我再次完成开发之后, 准备将代码上传, 却出现了一个上传代码的错误, 记录一下错误和解决方案
-
5
写一个类,继承SimpleRateThrottle,重写get_cache_key,返回[ip,用户id]什么,就以什么做限制,编写类属性 scope = 字符串,在配置文件中配置 'DEFAULT_THROTTLE_RATES': { '字符串': '3/m', } 配置在视图类,全局使用(配置在...
-
5
Supervisor启动并管理Celery相关进程 关于celery在运行过程中, 默认情况下是无法在关机以后自动重启的。所以我们一般开发中会使用supervisor进程监控来对celery程序进行运行监控!当celery没有启动的情况下,supe...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK