Django应用中无法获取POST请求数据的原因是什么?
解决Dio POST请求在Django端request.POST为空的问题
问题原因
- Dio默认会将
data参数中的Map序列化为JSON格式发送,请求头Content-Type为application/json - Django的
request.POST仅支持解析application/x-www-form-urlencoded(表单编码)格式的请求数据,无法直接读取JSON格式内容,因此打印出空字典
解决方案
方案1:修改Flutter端,发送表单编码格式的数据
让Dio发送Django能直接解析的表单格式数据,有两种实现方式:
方式A:使用FormData构造请求数据
void signup(context) async { Dio dio = Dio(); // 将Map转为FormData final formData = FormData.fromMap(getData()); final response = await dio.post( 'http://192.168.0.101:8000/signup/', data: formData, ); debugPrint(response.toString()); }
方式B:手动设置表单编码请求头
void signup(context) async { Dio dio = Dio(); final response = await dio.post( 'http://192.168.0.101:8000/signup/', data: getData(), options: Options( contentType: Headers.formUrlEncodedContentType, ), ); debugPrint(response.toString()); }
两种方式都能让Django的request.POST正常获取到请求数据。
方案2:修改Django端,解析JSON请求体
如果希望保持Flutter端发送JSON格式,可在Django端直接解析请求体中的JSON数据:
import json from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def signup(request): if request.method == 'POST': # 解析JSON格式的请求体 data = json.loads(request.body) print(data) return HttpResponse('Hello, world!')
内容的提问来源于stack exchange,提问作者Ayush Bajracharya
相关产品推荐
相关产品推荐

