未结束斜杠的APIView上的POST请求的Django RF 405错误

时间:2020-09-21 13:18:58

标签: django django-rest-framework request

我是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"
}

urls.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")

views.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. 错误的视图类型:405 "Method POST is not allowed" in Django REST framework405 “Method POST is not allowed” in Django REST framework
  2. 使用斜杠:405 POST method not allowedHow can I make a trailing slash optional on a Django Rest Framework SimpleRouter
  3. 潜在的缩进问题:django rest framework post method giving error "Method "POST" not allowed"
  4. 权限:https://www.thetopsites.net/article/53705361.shtml
  5. settings.py中的
  6. APPEND_SLASH:DRF post url without end slashhttps://docs.djangoproject.com/en/2.0/ref/settings/#append-slash

我还试图:

  • 即使urls.py没有一个也要在末尾加一个“ /”(新错误: 404找不到,因为URL不同)
  • 在终端而不是邮递员中进行测试(错误相同)

是否可以在不带'/'的情况下发出此请求?我使用Django工具有误吗?我看不到任何细微之处吗? 因此,如果有人有解决方案,建议或想法。谢谢!

1 个答案:

答案 0 :(得分:0)

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

解决方案:将路由器包含在urlpatterns末尾的

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 / 被视为单独的路由,为什么会起作用。