全新Django-Ninja-Extra项目中POST请求返回405方法不允许
解决POST请求返回405 Method Not Allowed的问题
1. 检查URL路由配置(最可能的核心原因)
你未提供项目根目录的urls.py代码,这大概率是问题所在。需确保Django的URL配置中正确挂载了Ninja Extra的API实例:
在项目根urls.py中添加如下配置:
from django.contrib import admin from django.urls import path from .api import api # 导入你定义的api实例 urlpatterns = [ path('admin/', admin.site.urls), path('api/', api.urls), # 将API挂载到/api/路径下 ]
若缺失此配置,你的API路由不会被Django识别,请求会被当作普通Django视图处理,直接返回405。
2. 处理CSRF验证
你的MIDDLEWARE启用了CsrfViewMiddleware,POST请求会触发CSRF校验,这也会导致405或403错误,可二选一解决:
- 方案一:禁用API的CSRF校验
在初始化API时添加csrf=False参数:from ninja_extra import NinjaExtraAPI api = NinjaExtraAPI(csrf=False) api.auto_discover_controllers() - 方案二:请求时携带CSRF令牌
若保留CSRF验证,需在请求头中添加X-CSRFToken字段,值取Cookie中的csrftoken值,同时补上请求体缺失的user_id:curl -X 'POST' \ 'http://127.0.0.1:8000/api/department/create/' \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -H 'X-CSRFToken: 你的CSRF令牌值' \ -d '{ "name": "string", "last_modified": "2024-12-11T15:35:25.361Z", "user_id": 1 }'
3. 补充请求体缺失字段
你的DepartmentIn Schema要求必须传入user_id,当前请求payload中无此字段,即使解决前面的问题,也会返回422验证错误,需在请求体中添加存在的用户ID值。
4. 验证路由注册状态
访问http://127.0.0.1:8000/api/docs(Ninja Extra自带文档页),检查是否存在/department/create/的POST路由:
- 若不存在,确认
departmentapp已在INSTALLED_APPS中(你的配置已满足) - 确认控制器文件命名为
api.py(你的department/api.py符合要求) - 重启Django开发服务器,确保代码修改生效
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

