JavaScript POST数据无法送达Django视图,address始终为null
问题分析与解决方案
核心问题原因
你的JavaScript请求存在Content-Type不匹配的问题,导致Django无法正确解析POST数据:
- 使用
FormData时,手动设置了Content-Type: application/json,但FormData默认需要的是multipart/form-data(浏览器会自动添加带boundary的正确头),错误的头让Django无法将数据解析到request.POST中。 - 若改用JSON格式发送数据,Django的
request.POST仅能解析表单编码的数据(application/x-www-form-urlencoded或multipart/form-data),JSON数据需要从request.body中读取解析。
解决方案1:修复FormData请求(推荐,与表单提交逻辑一致)
修改JavaScript代码,移除手动设置的Content-Type头,让浏览器自动处理:
postAccount(); async function postAccount() { const account = await getAccount().then(accounts => accounts[0]); const data = new FormData(); data.append("address", account.toString()); console.log("address=" + account.toString()); const post = new XMLHttpRequest(); post.open("POST", "{% url 'index' %}", true); // 移除错误的Content-Type设置 post.send(data); }
修改后Django即可通过request.POST.get("address")正常获取数据。
解决方案2:改用JSON格式发送数据(需同步修改Django视图)
若倾向于发送JSON格式数据,需同时调整前端和后端代码:
前端代码(发送JSON)
postAccount(); async function postAccount() { const account = await getAccount().then(accounts => accounts[0]); const data = JSON.stringify({"address": account.toString()}); console.log("address=" + account.toString()); const post = new XMLHttpRequest(); post.open("POST", "{% url 'index' %}", true); post.setRequestHeader('Content-Type', 'application/json'); post.send(data); }
后端Django视图代码(解析JSON)
import json @csrf_exempt def index(request): context = {} usernameInput = None; address = None; if (request.method == 'POST'): # 处理表单提交的username_input usernameInput = request.POST.get("username_input") # 处理JSON格式的address if request.content_type == 'application/json': try: json_data = json.loads(request.body) address = json_data.get("address") except json.JSONDecodeError: address = None print(usernameInput, address) if (usernameInput != None and address != None): user = generalUser(address = str(address), username = usernameInput, lastLogin = timezone.now()) user.save() return render(request, "chatswap/index.html", context)
额外提示
虽然你用@csrf_exempt跳过了CSRF验证,但生产环境中建议保留CSRF保护:前端可通过获取模板中的{% csrf_token %}值,在请求头中添加X-CSRFToken字段传递令牌,避免安全风险。
内容的提问来源于stack exchange,提问作者PBRParker
相关产品推荐
相关产品推荐

