django学习笔记--drf认证、权限、限流记录

news/2025/1/7 13:59:54/文章来源:https://www.cnblogs.com/liuzhiyangz/p/18653853

drf基础配置

版本:

Django              3.2
djangorestframework 3.13.1

纯净版配置:

INSTALLED_APPS = [# 'django.contrib.admin',# 'django.contrib.auth',# 'django.contrib.contenttypes',# 'django.contrib.sessions',# 'django.contrib.messages','django.contrib.staticfiles','api.apps.ApiConfig','rest_framework'
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',# 'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware',# 'django.contrib.auth.middleware.AuthenticationMiddleware',# 'django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request',# 'django.contrib.auth.context_processors.auth',# 'django.contrib.messages.context_processors.messages',],},},
]REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None
}

路由

from django.contrib import admin
from django.urls import path
from api import viewsurlpatterns = [# path('admin/', admin.site.urls),path('users/', views.UserView.as_view()),
]```
###视图
```python
from rest_framework.views import APIView
from rest_framework.response import Responseclass UserView(APIView):def get(self, request):return Response("...")

request参数:

路径参数

# urls.py
urlpatterns = [path('users/<str:version>/<int:pid>/',views.UserView.as_view())
]
# views.py
class UserView(APIView):def get(self, request,version,pid):print(version,pid)print(self.kwargs) #{version:'v1','pid':123}return Response("ok")

drf request对象获取参数示例:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticatedclass MyView(APIView):permission_classes = [IsAuthenticated]def post(self, request, *args, **kwargs):# 获取路径参数item_id = kwargs.get('item_id')# 获取查询参数search_query = request.query_params.get('search', '')# 获取请求头auth_token = request.headers.get('Authorization')# 获取表单或 JSON 数据data_field = request.data.get('data_field')# 获取文件uploaded_file = request.FILES.get('file')# 获取用户信息user = request.userreturn Response({"item_id": item_id,"search_query": search_query,"auth_token": auth_token,"data_field": data_field,"uploaded_file_name": uploaded_file.name if uploaded_file else None,"user": {"username": user.username, "email": user.email},})

认证

#基础类,定义一个认证类,需要实现如下基础类两个方法
class BaseAuthentication:def authenticate(self, request):raise NotImplementedError(".authenticate() must be overridden.")def authenticate_header(self, request):pass
# 简单实现示例:
from rest_framework.authentication import BaseAuthentication
from api.models import Userclass MyAuthentication(BaseAuthentication):def authenticate(self, request):token=request.headers.get('token')user=User.objects.filter(token=token).first()if user:return user,tokenreturn None,Nonedef authenticate_header(self, request):return 'Token'

源码路径

APIView,dispatch方法会调用self.initial(request, *args, **kwargs)
self.initial会依次调用下面三个方法分别为认证、权限、限流

        self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request)

下面我们先看下认证源码,上述的self都是APIView的子类对象, self.perform_authentication(request)调用request.user进入Request对象,调用Request如下方法,self.authenticators是配置在settings.REST_FRAMEWORK下的DEFAULT_AUTHENTICATION_CLASSES属性或者APIView子类的authentication_classes属性配置里,优先取view类里配置的,没有再取settings公共的

    def _authenticate(self):for authenticator in self.authenticators:try:user_auth_tuple = authenticator.authenticate(self)except exceptions.APIException:self._not_authenticated()raiseif user_auth_tuple is not None:self._authenticator = authenticatorself.user, self.auth = user_auth_tuplereturnself._not_authenticated()

备注:认证类默认前一个未认证会继续下一个,有一个认证成功就会终止认证继续后面逻辑,若认证抛出异常也会终止认证并返回,所有认证都没通过也会继续执行后面逻辑

权限

#自定义权限类,限制某个角色才能访问
from rest_framework.permissions import BasePermissionclass PermissionA(BasePermission):message = {"code": 1003, 'data': "无权访问"}def has_permission(self, request, view):if request.user.role == 2:return Truereturn False# 暂时先这么写def has_object_permission(self, request, view, obj):return True

源码简单分析:读取当前View类(如:UserView)配置的permission_classes,若未配置则取APIView默认配置settings.REST_FRAMEWORK的DEFAULT_PERMISSION_CLASSES属性

    def check_permissions(self, request):for permission in self.get_permissions():if not permission.has_permission(request, self):self.permission_denied(request,message=getattr(permission, 'message', None),code=getattr(permission, 'code', None))

备注:权限类默认有一个失败就返回异常,若想定制满足任意权限,可在APIView子类修改check_permission方法

def check_permissions(self, request):for permission in self.get_permissions():if permission.has_permission(request, self):return #有任一权限返回#无任何权限通过走此逻辑self.permission_denied(request,message=getattr(permission, 'message', None),code=getattr(permission, 'code', None))

限流

class MyRateThrottle(SimpleRateThrottle):cache = default_cache  # 访问记录存放在django的缓存中(需设置缓存)scope = "user"  # 构造缓存中的keycache_format = 'throttle_%(scope)s_%(ident)s''''设置访问频率,例如:1分钟允许访问10次,可在settings全局定义REST_FRAMEWORK = {"DEFAULT_THROTTLE_CLASSES":["xxx.xxx.xx.限流类", ],"DEFAULT_THROTTLE_RATES": {"user": "10/m",  #与scope对应,没有值会抛出异常"xx":"100/h"}}'''THROTTLE_RATES = {"user": "10/s"}#没有定义会去全局定义里取def get_cache_key(self, request, view):if request.user:ident = request.user.pk  # 用户IDelse:ident = self.get_ident(request)  # 获取请求用户IP(去request中找请求头)#throttle_user_11.11.11.11return self.cache_format % {'scope': self.scope, 'ident': ident}def throttle_failure(self):wait = self.wait()detail = {"code": 1005,"data": "访问频率限制",'detail': "需等待{}s才能访问".format(int(wait))}raise ThrottledException(detail)

使用限流需要使用django-redis,安装pip install django-redis

# cache缓存配置
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.31.125:6379/0","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 100},'decode_responses': True,"PASSWORD": "xxxx",},}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864595.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全测试工具burpsuite使用

一、BurpSuite简介及安装Burp Suite 是用于攻击web 应用程序的集成平台,它包含了许多Burp工具,这些不同的burp工具通过协同工作,有效的分享信息,支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击。它主要用来做安全性渗透测试,可以实现拦截请求、Burp Spider爬…

Diary - 2024.01.05

必须得补补觉了,额额今天又是一个啥题都不会做的状态,退化成功! 今日事迹:看出是暴力题不敢写,在一顿看似厉害的转化后得到了相同的时间复杂度! 想出来了没细算复杂度觉得过不了,结果不会其他做法了。 不会 *2400,感觉这个是最重量级的!!!多睡睡觉,多睡睡觉,我觉得…

20241428 《计算机基础与程序设计》课程总结

第一周作业总结 参考基于VirtualBox虚拟机安装Ubuntu图文教程安装Linux系统 自学计算机科学概论》并提出问题 第二周作业总结《计算机科学概论》:第一章向我们介绍了计算机科学这门学科的内容以及其基本概念,计算机科学是一门研究计算机及其周围各种现象和规律的科学,涵盖计…

国密证书的签名验签

数字证书结构①tbsCertificate域包含了主体名称和颁发者名称、主体的公钥、证书的有效期及其他相关信息。 ②signatureAlgorithm域包含了证书签发机构签发该证书所使用密码算法的标识符。该域的算法标识符必须与tbsCertificate中的signature标识的签名算法项相同。签名算法如为…

干货!带你了解7种检索增强生成 (RAG) 技术

回顾2023年RAG技术的发展,检索增强生成(Retrieval-Augmented Generation,RAG)技术彻底改变了人工智能模型的工作方式,它将生成式人工智能的优势与检索现实世界文档的精确性相结合。通过从外部来源提取相关数据,RAG使得人工智能能够生成更准确且上下文更合适的答案。随着这…

在浏览器中以按钮的方式执行Shell脚本

一、功能描述 有时候我们需要不定时的在服务器上执行某些脚本,当然我们可以使用电脑+XShell等工具登录到服务器运行脚本,如果使用手机就不方便操作了,那我们把脚本放在WEB页面中,只要手机可以正常访问到服务器,就可以使用浏览器打开页面,点击对应的按钮完成操作。 在网页…

基于ESP32的桌面小屏幕实战[5]:PCB下单

1. 焊接调试前准备 PCB下单 点击“PCB下单”检查一下DRC确认无错误之后,确认下单然后就会跳转到下面的网页基本上保持默认选项即可。可以看到“焊盘喷镀”有3个选项。在选择表面处理工艺时,应综合考虑产品的具体需求、环保法规以及成本等因素。例如,对于环保要求较高的消费电…

使用生成式人工智能进行软件测试1使用大型语言模型增强测试

1 使用大型语言模型增强测试 1.1 认识人工智能工具对测试和开发的影响 在过去,想要利用人工智能的个人必须具备开发、训练和部署人工智能模型的技能,或者有一个专家团队来完成这些任务,所有这些都会使在日常活动中使用人工智能成为一项昂贵而独特的工作。随着最近人工智能的…

20241319 《计算机基础与程序设计》课程总结

每周作业链接汇总第零周作业:链接,简要内容:自我介绍,课程预习与准备,建立个人技术博客,加入云班课.第一周作业:链接,简要内容:课程概论,工业革命与浪潮之巅,信息与信息安全,计算机系统概论,计算机安全,计算的限制,计算思维.第二周作业:链接,简要内容:数字化…

2024-2025-1 20241409《计算机基础与程序设计》第十五周学习总结

自我介绍很高兴加入2024计算机基础与程序设计 (北京电子科技学院 - 网络空间安全)的班级的大家庭。 第一周作业1.对《计算机基础与程序设计》进行了概述,有了基础的了解。 2.学习了有关2进制、8进制、10进制、16进制之间的转换。 第二周作业1.学习了《计算机科学概论》第一章,…

前端性能优化原理与实践笔记

知识体系与小册格局 写给读者 提起性能优化,大家现在脑海里第一时间会映射出什么内容呢? 可能是类似“雅虎军规”和《高性能 JavaScript》这样历久弥香的经典之作,也可能是搜索引擎聚合给你的一篇又一篇以性能优化为主题的个人或团队实践而来的“私货”。至少当我确定自己的…

20241420 《计算机基础与程序设计》课程总结

20241420 《计算机基础与程序设计》课程总结 每周作业链接汇总 第0周作业:自我介绍与展望 https://www.cnblogs.com/vincent2077/p/18432491第一周作业:安装Linux系统并根据每章内容提出先导提问 https://www.cnblogs.com/vincent2077/p/18438668第二周作业:《计算机科学概论…