Django createTruck接口调用时Postman返回Method "POST" not allowed错误
问题根因
- 核心原因:Django路由顺序匹配错误
Django的路由规则是从上到下优先匹配,你当前urls.py中二级路径的通配路由trucks/<str:pk>/放在了固定路径路由trucks/create/前面。当你请求/api/trucks/create/时,Django会把路径中的create字符串当成pk参数,直接匹配到getTruck视图,而getTruck接口只允许GET请求,因此返回Method "POST" not allowed报错。
删除、更新接口正常的原因是这两个接口的路径是三级路径(trucks/delete/<str:pk>/、trucks/update/<str:pk>/),不会被二级的通配路由匹配到,因此可以正常触发对应视图。 - 附带潜在问题
- 视图字段拼写错误:
createTruck视图中取参数写的是data['prototyp'],少了末尾的字母e,和请求体中的prototype字段名不匹配,路由问题修复后会直接抛出KeyError。 - 用户赋值逻辑冲突:你在视图中直接取
request.user赋值给卡车的user外键,但Postman请求没有携带认证信息时request.user是匿名用户,无法存入外键字段;且你请求体中传递的user参数在视图中完全没有被使用。
修复步骤
- 调整
urls.py的路由顺序,把所有二级固定路径路由放在通配路由前面,修改后代码如下:
urlpatterns = [ path('trucks/', views.getTrucks, name="trucks"), path('trucks/create/', views.createTruck, name="create-truck"), path('trucks/<str:pk>/', views.getTruck, name="truck"), path('trucks/delete/<str:pk>/', views.deleteTruck, name="delete-truck"), path('trucks/update/<str:pk>/', views.updateTruck, name="update-truck"), ]
- 修复
createTruck视图的字段拼写错误和用户赋值逻辑:
如果你测试阶段不需要做权限校验,直接取请求体中的user参数即可,修改后代码如下:
@api_view(['POST']) def createTruck(request): data = request.data # 取请求体中的用户ID查询用户对象 user = User.objects.get(id=data['user']) truck = Truck.objects.create( user=user, image=data['image'], make=data['make'], prototype=data['prototype'], # 修复拼写错误 year=data['year'], serviceInterval=data['serviceInterval'], nextService=data['nextService'], seats=data['seats'], bedLength=data['bedLength'], color=data['color'], vin=data['vin'], currentMileage=data['currentMileage'] ) serializer = TruckSerializer(truck, many=False) return Response(serializer.data)
如果你需要保留request.user的权限校验逻辑,需要在Postman的请求头中添加对应的认证信息,比如DRF Token认证需要添加Authorization: Token 你的用户token参数。
内容的提问来源于stack exchange,提问作者Sog t
相关产品推荐
相关产品推荐

