首页 > 解决方案 > APIView 上的 POST 请求的 Django RF 405 错误,没有结束斜线

问题描述

我对 Django Rest Framework 很陌生,我一直在调查这个问题,但找不到任何解决方案。我很确定这将是一个小细节,但我不知道。

我正在为一个项目使用 DRF。团队选择不以“/”结束 URL 路径。我有一个使用 POST 方法链接到 APIView 的端点。我们想用这个 POST 中发送的正文做一些事情。但是调用它会带来(邮递员回应):

405 方法不允许

{
    "detail": "Method \"POST\" not allowed."
}

在 URL 路径的末尾放置一个“/”是有效的(邮递员对正常行为的响应):

{
    "success": True,
    "message": "A message returned by the function in APIView"
}

网址.py

from django.urls import path, include
from runbook import views
from rest_framework.routers import DefaultRouter


router = DefaultRouter(trailing_slash=False)

router.register(r'my_objects', views.ObjectViewset)

urlpatterns = [
    path('', include(router.urls)),
    path('my_objects/myFunction',
         views.MyFunctionView.as_view(),
         name="my-function")

视图.py

class MyFunctionView(APIView):
    """
    """
    def post(self, request, format=None):
        try:
            MyObject.objects.get(slug=slugify(request.data['candidate_name']))
        except MyObject.DoesNotExist:
            return Response(boolean_response(False))
        else:
            return Response(boolean_response(True))

我阅读并尝试过的内容

  1. 错误的视图类型:Django REST 框架中的 405“不允许使用方法 POST”Django REST 框架中的 405“不允许使用方法 POST”
  2. 使用斜线:405 POST method not allowed如何在 Django Rest Framework SimpleRouter 上使斜杠可选
  3. 潜在的缩进问题:django rest 框架发布方法给出错误“方法“POST”不允许”
  4. 权限:https ://www.thetopsites.net/article/53705361.shtml
  5. settings.py 中的 APPEND_SLASH:没有斜杠的 DRF 发布网址https://docs.djangoproject.com/en/2.0/ref/settings/#append-slash

我也尝试过:

是否可以在没有“/”的情况下提出此请求?我使用 Django 工具错了吗?有什么我没有看到的微妙之处吗?因此,如果有人有解决方案、建议或想法。谢谢 !

标签: djangodjango-rest-frameworkrequest

解决方案


正如@Arakkal Abu 在评论中所说,路由器与 urlpatterns 中的其他路径冲突

解决方法:在urlpatterns末尾发送router include

router = DefaultRouter(trailing_slash=False)

router.register(r'my_objects', views.ObjectViewset)
urlpatterns = [
path('my_objects/myFunction',
     views.MyFunctionView.as_view(),
     name="my-function"),
path('', include(router.urls))
]

实际上my_objects/myFunction被认为是路径my_objects/的一部分,其中my_objects/myFunction/被认为是单独的路径,这就是它起作用的原因。


推荐阅读