Django REST Framework中PUT方法不允许,单字段更新失败求助
解决PUT方法不被允许的问题
你在使用Django REST Framework的ModelViewSet更新设备对象时碰到PUT方法被禁止的问题,我来帮你一步步排查可能的原因:
1. 先检查路由配置是否正确
ModelViewSet默认自带了update(对应PUT请求)、partial_update(对应PATCH请求)等方法,但前提是你得用DRF的路由注册器来配置路由。如果是手动写路由,很可能漏掉了PUT方法的映射。
正确的路由配置示例:
from rest_framework import routers from .views import DeviceViewSet router = routers.DefaultRouter() router.register(r'devices', DeviceViewSet) urlpatterns = [ # 其他路由... path('', include(router.urls)), ]
要是你手动配置路由,一定要明确添加PUT方法的映射:
path('devices/<pk>/', DeviceViewSet.as_view({'put': 'update'})),
2. 确认权限类没限制PUT请求
看看你的视图或者全局配置里的权限设置,比如如果用了ReadOnlyModelPermission,会直接禁止所有修改类请求(PUT/PATCH/DELETE)。
检查视图里的权限配置:
class DeviceViewSet(viewsets.ModelViewSet): queryset = Device.objects.all() serializer_class = DeviceSerializer permission_classes = [IsAuthenticated] # 确保不是只读权限 # ...你的list方法
也可以去全局settings.py里核对:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', # 别加ReadOnlyModelPermission这类只读权限 ] }
3. 检查请求URL是否指向单个资源
PUT请求必须针对单个资源的详情URL,比如/api/devices/1/(对应pk=1的设备),而不是列表URL/api/devices/——列表URL只支持GET(查列表)和POST(新建),不接受PUT请求。
4. CSRF认证问题(针对浏览器端请求)
如果是在浏览器里通过表单或AJAX发PUT请求,Django默认会检查CSRF token。要确保请求里携带了CSRF token:
- AJAX请求可以在请求头里加
X-CSRFToken,值从页面的cookie中获取; - 要是用Postman等工具测试,可以临时关闭CSRF检查(生产环境不建议这么做)。
5. 确认没重写update方法导致异常
虽然你只贴了list方法,但如果视图里自定义了update方法,要确保它能正常处理PUT请求。不过ModelViewSet的默认update方法是支持PUT的,除非重写时出现了逻辑错误。
如果以上步骤都排查过还是有问题,可以把完整的路由配置和视图代码贴出来,我再帮你深挖问题。
内容的提问来源于stack exchange,提问作者user7128116
相关产品推荐
相关产品推荐

