django - 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))
我阅读并尝试过的内容:
- 错误的视图类型:Django REST 框架中的 405“不允许使用方法 POST”;Django REST 框架中的 405“不允许使用方法 POST”
- 使用斜线:405 POST method not allowed;如何在 Django Rest Framework SimpleRouter 上使斜杠可选
- 潜在的缩进问题:django rest 框架发布方法给出错误“方法“POST”不允许”
- 权限:https ://www.thetopsites.net/article/53705361.shtml
- settings.py 中的 APPEND_SLASH:没有斜杠的 DRF 发布网址;https://docs.djangoproject.com/en/2.0/ref/settings/#append-slash
我也尝试过:
- 即使 urls.py 没有,最后也使用“/”调用(新错误:404 Not found because URL is not the same)
- 在终端而不是 Postman 中测试(同样的错误)
是否可以在没有“/”的情况下提出此请求?我使用 Django 工具错了吗?有什么我没有看到的微妙之处吗?因此,如果有人有解决方案、建议或想法。谢谢 !
解决方案
正如@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/被认为是单独的路径,这就是它起作用的原因。
推荐阅读
- python - matplotlib ( python) - 在单击事件中更改全局变量
- javascript - IntersectionObserver - 如何检测已删除
- google-cloud-trace - Google Cloud TRACE 未显示自定义时间范围和某些项目的 TRACE 报告
- database - 记录中不是(主)键的部分是什么词?
- go - os.Stdout 和 syscall.Stdout 有什么区别?
- rstudio - 有没有办法在 R 或 RStudio 中全局设置 connectionOptions=NULL ?
- mongodb - AWS Lambda 默认 VPC - 无法连接在 EC2 上运行的 mongodb
- python - Python 请求不在源页面中的数据 (requests.get)
- c# - 填充二维数组是添加一个新元素而不是一行
- reactjs - 如何从嵌套的动态创建的组件中更改 React 状态?