JavaScript Fetch调用Django视图时出现JSONDecodeError问题
问题原因
Django的request对象的body是类似文件的流对象,只能被读取一次。你在视图中连续两次调用json.load(request),第一次读取后流的指针已移到末尾,第二次调用时无内容可读,因此抛出JSONDecodeError。浏览器的错误是因为服务器返回500错误页面(HTML格式),而前端尝试将其解析为JSON导致的,解决后端问题后该错误会自动消失。
修复方案
将JSON数据一次性读取并解析到变量中,后续从该变量获取所需字段,避免重复读取request body:
修改后的views.py代码:
if request.method == 'PUT': user = CustomUser.objects.get(username=kwargs.get('username')) # 一次性解析所有JSON数据到payload变量 payload = json.load(request) switchType = payload['type'] switchData = payload['switch'] print(switchType, switchData) if switchType == 'adminUser': user.admin_user = switchData elif switchType == 'admindata': user.admin_data = switchData elif switchType == 'Status': if user.status == COMMON.USER_ACTIVE: user.status = COMMON.USER_SUSPENDED else: user.status = COMMON.USER_ACTIVE user.failed_logins = 0 user.save() return JsonResponse({})
额外说明
- 前端代码无需修改,
Content-Type: application/json和CSRF Token的设置都是正确的。 - 若后续需要避免字段缺失导致的
KeyError,可以使用get方法获取字段,比如switchType = payload.get('type', '')。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

