Django Action如何接收无末尾斜杠的POST请求?
解决Django DRF Action无法匹配无末尾斜杠POST请求的问题
方案一:给action的url_path加可选斜杠正则
直接修改action装饰器的url_path参数,用正则表达式让它同时匹配带或不带末尾斜杠的请求:
@action(methods=['post'], detail=False, url_path=r'alert/?') def get_post(self, request, pk=None, *args, **kwargs): # 你的业务逻辑代码
这里的r'alert/?'是正则表达式,?表示前面的斜杠是可选的,这样不管请求是config/alert还是config/alert/都能被捕获。
方案二:全局关闭自动加斜杠(不推荐,有副作用)
如果你的项目可以接受全局URL都不需要末尾斜杠,可修改项目根目录下的settings.py,把APPEND_SLASH设为False:
APPEND_SLASH = False
但这个设置会影响整个项目的所有URL规则,可能导致其他原本依赖末尾斜杠的路由失效,除非你确认所有接口都不需要斜杠,否则不建议用这个方法。
方案三:手动在urls.py中添加无斜杠路由
如果上面的方法都不适用,你可以在项目的urls.py里手动添加一条指向该action的路由,放在router注册代码之后:
from django.urls import path from .views import YourViewSet # 先注册你的ViewSet到router router = DefaultRouter() router.register(r'config', YourViewSet) # 手动添加无斜杠的路由 urlpatterns = [ path('config/alert', YourViewSet.as_view({'post': 'get_post'}), name='config-alert'), *router.urls, ]
这样就能直接匹配config/alert的POST请求,不会影响其他路由的规则。
内容的提问来源于stack exchange,提问作者Dogac Topay
相关产品推荐
相关产品推荐

