如何在Django多应用间共享通用权限?
Django多应用通用权限的优化方案
针对你提到的多应用重复编写相同权限类的问题,有几种更高效的实现方式,彻底解决代码重复的问题:
1. 新建核心通用应用(推荐)
创建一个专门存放跨应用通用代码的Django应用(比如命名为core、common或utils),把通用权限类统一维护在这里,其他应用直接引用或基于此扩展。
具体操作:
- 执行
python manage.py startapp core创建核心应用(如果不需要数据库模型,可跳过migrations相关配置) - 在
core/permissions.py中编写通用权限类:
from rest_framework.permissions import BasePermission class ReadOnlyPermission(BasePermission): def has_permission(self, request, view): # 通用只读权限逻辑:仅允许GET/HEAD/OPTIONS请求 return request.method in ('GET', 'HEAD', 'OPTIONS')
- 在其他应用(如app1、app2)中直接导入使用,或根据需求继承扩展:
# app1/permissions.py from core.permissions import ReadOnlyPermission # 无需修改的话直接用ReadOnlyPermission即可 # 需要微调时,继承后重写对应方法 class App1ReadOnlyPermission(ReadOnlyPermission): def has_object_permission(self, request, view, obj): # 新增app1特有的对象权限判断 return super().has_object_permission(request, view, obj) and obj.created_by == request.user
这种方式统一维护逻辑,修改一次所有应用同步生效,符合Django应用结构规范,适合中大型项目。
2. 项目根目录创建通用工具模块(轻量版)
如果不想新增Django应用,也可以在项目根目录建一个普通Python包(比如common),存放跨应用通用代码,无需注册到INSTALLED_APPS。
具体操作:
- 在项目根目录新建
common文件夹,添加__init__.py和permissions.py文件 - 在
common/permissions.py中编写通用权限类(代码同上述核心应用的权限类) - 其他应用中直接导入使用:
from common.permissions import ReadOnlyPermission
这种方式更轻量,适合小型项目或无数据库模型的通用代码场景。
注意事项
- 确保导入路径正确,避免循环导入问题
- 通用权限需微调时,优先用继承扩展,不要直接修改通用类,防止影响其他应用
- 核心应用若无需数据库模型,可在
core/apps.py中设置default_auto_field = None,并删除migrations文件夹,减少冗余配置
内容的提问来源于stack exchange,提问作者whoami
相关产品推荐
相关产品推荐

