You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django同一API在多应用中使用不同权限类的实现方法

解决方案

不需要创建新的API,有几种实用方式可以实现同一业务逻辑的API使用不同权限类调用:

1. 继承原视图类,仅替换权限配置

这是最直观的方案,完全复用原视图的业务逻辑,只修改权限类:

在另一个Form应用的views.py中:

from Form_Hospital.views import RequisitionFormAV
from rest_framework.permissions import IsAdminUser  # 替换为你需要的目标权限类

class AdminRequisitionFormAV(RequisitionFormAV):
    permission_classes = [IsAdminUser]  # 配置新的权限规则

然后在该应用的urls.py中配置专属路由:

from django.urls import path
from .views import AdminRequisitionFormAV

urlpatterns = [
    path('admin-requisitions/', AdminRequisitionFormAV.as_view(), name='admin-requisition-form'),
]

2. 动态切换权限(重写get_permissions方法)

如果希望同一个视图根据请求条件(比如路由前缀、用户角色)自动适配权限,可以在原视图类中重写get_permissions方法:

修改Form_Hospital/views.py中的RequisitionFormAV:

class RequisitionFormAV(APIView):
    '''
    to post a "Requisition Form" and get list.
    '''
    # 移除原有的permission_classes硬编码

    def get_permissions(self):
        # 根据路由前缀判断使用对应权限
        if self.request.path.startswith('/form/admin/'):
            return [IsAdminUser()]
        else:
            return [IsAuthenticatedActiveHospitalStaff()]

    # 原有的get、post业务逻辑保持不变

之后在两个应用的urls.py中分别配置路由指向该视图:

# Form_Hospital的urls.py
urlpatterns = [
    path('hospital-requisitions/', RequisitionFormAV.as_view(), name='hospital-requisition-form'),
]

# Form应用的urls.py
urlpatterns = [
    path('admin/requisitions/', RequisitionFormAV.as_view(), name='admin-requisition-form'),
]

3. 使用权限装饰器覆盖配置

利用DRF的permission_classes装饰器,直接给原视图类添加新权限规则,生成新的视图类:

from Form_Hospital.views import RequisitionFormAV
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAdminUser

# 装饰后生成带新权限的视图类
AdminRequisitionFormAV = permission_classes([IsAdminUser])(RequisitionFormAV)

同样在该应用的urls.py中配置路由即可。

推荐选择

如果只是不同应用需要独立权限控制,**方案1(继承视图类)**最清晰,代码复用性高,后续也方便各自扩展;如果需要同一视图根据动态条件切换权限,再考虑方案2。

内容的提问来源于stack exchange,提问作者golu kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:27:36