如何在urls.py中控制用户登录权限?(drf_auto_endpoint场景)
在urls.py中实现用户登录权限控制的方案
因为你无法修改drf_auto_endpoint库,以下几种方案可以在不修改库代码的前提下,为接口添加登录权限控制:
方案一:修改路由视图的权限配置
直接在你的urls.py中遍历router的所有视图,为它们添加认证权限:
from drf_auto_endpoint.router import router from rest_framework.permissions import IsAuthenticated # 为router中所有视图添加登录认证权限 for url_pattern in router.urls: # 检查视图是否有view_class属性(DRF视图类的特征) if hasattr(url_pattern.callback, 'view_class'): view_class = url_pattern.callback.view_class # 保留原有权限(如果存在),追加IsAuthenticated权限 if hasattr(view_class, 'permission_classes'): view_class.permission_classes = list(view_class.permission_classes) + [IsAuthenticated] else: view_class.permission_classes = [IsAuthenticated] # 正常配置路由 urlpatterns = [ # ... 其他路由 path('api/v1/', include(router.urls)), ]
这个方法会批量给router生成的所有接口添加登录要求,无需修改库代码。
方案二:全局设置DRF默认权限
如果你的项目中所有接口都需要登录认证,可以直接在settings.py中配置DRF的全局默认权限:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
这种方式会对所有DRF视图生效,包括drf_auto_endpoint生成的接口,配置最简单。
方案三:用装饰器包裹路由组
如果需要更灵活的控制(比如仅部分接口需要认证),可以创建一个带权限的包装视图,将router的路由通过这个视图转发:
from django.urls import path from drf_auto_endpoint.router import router from rest_framework.decorators import permission_classes, api_view from rest_framework.permissions import IsAuthenticated from django.http import HttpResponseNotFound # 带权限的包装视图 @api_view(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']) @permission_classes([IsAuthenticated]) def protected_api_router(request, *args, **kwargs): # 匹配router中的对应视图 for url_pattern in router.urls: match = url_pattern.resolve(request.path_info.replace('/api/v1/', '', 1)) if match: return match.func(request, *args, **match.kwargs) return HttpResponseNotFound() urlpatterns = [ # ... 其他路由 path('api/v1/<path:path>', protected_api_router), ]
注意这个方法需要调整路由匹配规则,将原include(router.urls)替换为指向包装视图的路径。
内容的提问来源于stack exchange,提问作者edche
相关产品推荐
相关产品推荐

