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

Flask应用中从非jQuery的Ajax请求提取数据返回None问题

解决Flask无法解析原生Ajax JSON请求的问题

嘿,我帮你定位到问题啦!你的原生Ajax请求缺少关键的请求头设置,而且数据格式也没对应上Flask的预期,导致request.get_json()一直返回None。咱们一步步来修正:

1. 给Ajax请求添加JSON请求头

原生XMLHttpRequest发送JSON数据时,必须明确告诉服务器请求体的格式是JSON,否则Flask默认不会自动解析请求体为JSON对象。你需要在request.open()之后、request.send()之前添加这行代码:

request.setRequestHeader("Content-Type", "application/json");

2. 修正发送的JSON数据结构

你现在直接JSON.stringify(localStorage.getItem("user"))得到的是一个字符串的JSON序列化结果(比如如果localStorage里存的是"alex",序列化后会是"\"alex\""),但Flask代码里想取name.user,说明你需要发送一个包含user字段的对象。所以要先把用户名包装成对象再序列化:

const userObj = { user: localStorage.getItem("user") };
const userJson = JSON.stringify(userObj);
request.send(userJson);

3. 优化Flask后端的代码

原来的判断逻辑可以更简洁,而且要注意request.get_json()返回的是Python字典,不是对象,所以要用键名访问而不是属性访问:

from flask import Flask, request, session, render_template

@app.route("/", methods=["GET", "POST"])
def index():
    if request.is_json:  # 先判断是否是合法的JSON请求
        data = request.get_json()
        print(data)  # 可以看到完整的JSON数据
        # 确保user字段存在再赋值
        if "user" in data:
            session["name"] = data["user"]
    return render_template("index.html", channels=channels)

完整修改后的JavaScript代码

if(localStorage.getItem("user")) {
    document.querySelector("#logout").addEventListener("click", () => {
        localStorage.removeItem("user");
    });
    const request = new XMLHttpRequest();
    request.open("POST", "/");
    // 添加JSON请求头
    request.setRequestHeader("Content-Type", "application/json");
    // 包装成正确的对象结构并序列化
    const userObj = { user: localStorage.getItem("user") };
    const userJson = JSON.stringify(userObj);
    request.send(userJson);
}

这样修改后,Flask就能正确解析你的Ajax请求数据啦!

内容的提问来源于stack exchange,提问作者M. Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:01:00