当前位置:首页 > 技术 > 正文内容

DRF内置认证、权限与频率组件详解,以及Django配置、过滤类高级用法、异常处理和接口文档

访客 技术 2026年7月31日 3

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 参数)
  • 返回格式示例

实践中常见三种方式:

  1. 使用 Word/Markdown 手动编写
  2. 使用接口文档平台(如 YApi、ShowDoc、第三方收费服务或自研平台)
  3. 自动生成文档(如 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 字段

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。