Django REST API中POST请求request.POST返回None问题求助
Django REST API POST请求无法获取参数问题
问题描述
开发Django REST API时编写了create视图,发送包含完整正确参数的POST请求时,key打印结果为None;将请求方式改为GET后,使用request.GET可正常获取参数。但该接口用于数据库写入,必须使用POST请求。
补充说明:尝试使用request.data返回空对象{},request.POST同样为空,使用Postman以form-data格式发送请求。
视图代码
@api_view(['POST']) def create(request): key = request.POST.get('key') name = request.POST.get("name") email = request.POST.get("email") password = request.POST.get("password") print(key) if(key=='0'): user = Users(name=name,email=email,password=password) user.save() return Response("User Created Successfully") else: return Response("Invalid Key")
问题原因
Django REST Framework的request.POST仅支持解析application/x-www-form-urlencoded编码的请求体,而Postman中form-data格式对应的Content-Type是multipart/form-data,这种情况下request.POST无法解析参数;DRF默认已包含MultiPartParser,若request.data仍为空,需确认请求格式是否正确。
解决办法
方法1:调整Postman请求格式
将Postman的请求体格式改为x-www-form-urlencoded,此时request.POST可以正常获取参数,无需修改代码。
方法2:改用request.data获取参数
DRF的request.data兼容multipart/form-data、application/json等多种请求格式,直接替换request.POST为request.data即可:
@api_view(['POST']) def create(request): key = request.data.get('key') name = request.data.get("name") email = request.data.get("email") password = request.data.get("password") print(key) if key == '0': user = Users(name=name, email=email, password=password) user.save() return Response("User Created Successfully") else: return Response("Invalid Key")
方法3:使用DRF序列化器(推荐)
遵循DRF最佳实践,用序列化器处理参数验证和模型创建,自动适配多种请求格式,同时提升代码规范性:
from rest_framework import serializers from .models import Users class UserSerializer(serializers.ModelSerializer): class Meta: model = Users fields = ['name', 'email', 'password'] @api_view(['POST']) def create(request): key = request.data.get('key') if key == '0': serializer = UserSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response("User Created Successfully") return Response(serializer.errors, status=400) else: return Response("Invalid Key", status=400)
内容的提问来源于stack exchange,提问作者Ashutosh Aswani
相关产品推荐
相关产品推荐

