You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:10:40