DRF内置认证、权限与频率组件详解,以及Django配置、过滤类高级用法、异常处理和接口文档
1. DRF 内置认证、权限与频率组件
这里列出 DRF 提供的内置认证、权限和频率类,方便查阅。具体实现细节不再赘述。
1.1 内置认证类
from rest_framework.authentication import BaseAuthentication, RemoteUserAuthentication, TokenAuthentication, SessionAuthentication
# 所有认证类均继承自 BaseAuthentication
# RemoteUserAuthentication 源码解析
class RemoteUserAuthentication(BaseAuthentication):
header = "REMOTE_USER"
def authenticate(self, request):
user = authenticate(request=request, remote_user=request.META.get(self.header))
if user and user.is_active:
return (user, None)
# SessionAuthentication 源码解析
class SessionAuthentication(BaseAuthentication):
def authenticate(self, request):
user = getattr(request._request, 'user', None)
if not user or not user.is_active:
return None
self.enforce_csrf(request)
return (user, None)
1.2 内置权限类
from rest_framework.permissions import BasePermission, AllowAny, IsAuthenticated, IsAdminUser
# 所有权限类均继承自 BasePermission
# AllowAny 源码解析:始终返回 True,不限制任何权限
class AllowAny(BasePermission):
def has_permission(self, request, view):
return True
# IsAdminUser 源码解析:仅允许管理员用户访问
class IsAdminUser(BasePermission):
def has_permission(self, request, view):
return bool(request.user and request.user.is_staff)
# IsAuthenticated 源码解析:仅允许已登录用户访问
class IsAuthenticated(BasePermission):
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)
1.3 内置频率类
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle, AnonRateThrottle
# AnonRateThrottle:按 IP 地址限制访问频率,只需在配置文件中设置
# 'DEFAULT_THROTTLE_RATES': {
# 'anon': '3/m',
# }
# UserRateThrottle:按用户 ID 限制访问频率,同样在配置文件中设置
# 'DEFAULT_THROTTLE_RATES': {
# 'user': '3/m',
# }
# 获取客户端 IP 的常用请求头
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
2. Django 配置文件核心项详解
# 配置项必须是大写字母
# Django 项目启动时需先加载配置文件,配置错误会导致项目无法运行
from pathlib import Path
# 项目根目录
BASE_DIR = Path(__file__).resolve().parent.parent
# 密钥,用于加密操作,自动生成且复杂
SECRET_KEY = 'django-insecure-4i$6azd399fl$vh9%*7#oald(i&ik(5#i_-y)v&z3g+cxsd$@-'
# 调试模式开关:True 时可在浏览器直接查看异常信息,路径错误时会提示可选路径
DEBUG = True
# 允许访问的主机列表,上线后需填写服务器地址;当 DEBUG=False 时必须配置,否则报错
ALLOWED_HOSTS = ['*']
# 应用列表,Django 的丰富功能源自内置应用
INSTALLED_APPS = [
'django.contrib.admin', # 后台管理
'django.contrib.auth', # 认证与权限(6张表)
'django.contrib.contenttypes', # 内容类型
'django.contrib.sessions', # Session 认证(django_session 表)
'django.contrib.messages', # 消息框架
'django.contrib.staticfiles', # 静态文件管理
'app01.apps.App01Config', # 自定义应用
'rest_framework', # DRF
]
# 中间件配置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全中间件
'django.contrib.sessions.middleware.SessionMiddleware', # Session 管理
'django.middleware.common.CommonMiddleware', # URL 重定向(自动添加斜杠)
'django.middleware.csrf.CsrfViewMiddleware', # CSRF 防护
'django.contrib.auth.middleware.AuthenticationMiddleware', # 用户认证
'django.contrib.messages.middleware.MessageMiddleware', # 消息框架(类似 Flask 的闪现)
'django.middleware.clickjacking.XFrameOptionsMiddleware', # 点击劫持防护
]
# 根路由配置,所有请求入口
ROOT_URLCONF = 'drf_day08.urls'
# 模板引擎配置
TEMPLATES = []
# WSGI 应用入口,生产环境用 uwsgi,测试用 manage.py
WSGI_APPLICATION = 'drf_day08.wsgi.application'
# 数据库配置(支持多数据库)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Auth 认证相关配置
# 国际化设置
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# 静态文件 URL 前缀
STATIC_URL = '/static/'
# 默认主键字段类型
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
3. 过滤类高级用法
DRF 内置的 SearchFilter 仅支持通过 ?search= 进行模糊搜索,无法指定精确字段。若需按特定字段精确搜索(如同时按姓名和性别搜索),可使用自定义过滤类或第三方库。
# 第三方库 django-filter 的使用
# 1. 安装:pip3 install django-filter
# 2. 在视图中配置 filter_backends = [DjangoFilterBackend]
# 3. 指定搜索字段:filterset_fields = ['name', 'publish']
# 4. 示例请求:http://127.0.0.1:8008/books/?name=三国演义&publish=南京出版社
# 支持精确查找,多个条件为"与"关系
# 自定义过滤类:必须继承 BaseFilterBackend 并重写 filter_queryset 方法
# 多个过滤器和排序可共存于 filter_backends 列表,执行顺序从左到右,建议将高效过滤器放在前面
class CustomUserFilterBackend(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
name_param = request.query_params.get('name', None)
email_param = request.query_params.get('email', None)
if name_param and email_param:
return queryset.filter(name__icontains=name_param, email__icontains=email_param)
elif name_param:
return queryset.filter(name__icontains=name_param)
elif email_param:
return queryset.filter(email__icontains=email_param)
return queryset
4. 全局异常处理
全局异常处理旨在统一所有错误响应格式。通常公司仅返回错误码而非具体错误信息(因为前端难以理解),以下是一个典型实现:
# 未提供具体代码,但核心思路是自定义异常处理函数,捕获所有异常并返回统一 JSON 结构
# 例如:{"code": 500, "msg": "服务器内部错误"}
5. 接口文档
接口编写完成后,需为前端提供清晰的文档。文档应包含:
- 请求地址
- 请求方式
- 支持的编码格式
- 请求参数(GET/POST 参数)
- 返回格式示例
实践中常见三种方式:
- 使用 Word/Markdown 手动编写
- 使用接口文档平台(如 YApi、ShowDoc、第三方收费服务或自研平台)
- 自动生成文档(如 Swagger、CoreAPI)
# 使用 CoreAPI 自动生成文档
# 1. 安装:pip3 install coreapi
# 2. 路由配置:
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('docs/', include_docs_urls(title='站点页面标题'))
]
# 3. 在视图类中添加注释
# 4. 在 settings.py 中配置:
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
# 注意:
# - 直接在视图类中编写注释
# - 在序列化类中添加 help_text 字段