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
相关产品推荐
相关产品推荐

