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

如何在无jQuery时实现Python Flask向AJAX传输JSON数据

当然可行!完全不需要依赖jQuery,原生JavaScript有两种常用方案可以实现:Fetch API(现代浏览器推荐,语法更简洁)和传统的XMLHttpRequest(兼容老旧浏览器)。我给你分Flask后端和前端实现两部分来演示,覆盖GET和POST两种常见场景。

第一步:Flask后端准备

先写几个基础接口,用于返回数据和接收前端请求:

from flask import Flask, jsonify, request

app = Flask(__name__)

# 示例1:返回静态JSON数据的GET接口
@app.route('/api/data', methods=['GET'])
def get_data():
    # 这里可以替换成从数据库/其他数据源获取的真实数据
    server_data = {
        'message': '来自Flask服务器的问候',
        'items': ['苹果', '香蕉', '橙子'],
        'status': 'success'
    }
    return jsonify(server_data)

# 示例2:接收前端POST数据并返回响应的接口
@app.route('/api/submit', methods=['POST'])
def submit_data():
    # 解析前端发送的JSON数据
    client_data = request.get_json()
    if not client_data:
        return jsonify({'error': '未收到有效数据'}), 400
    
    # 这里可以添加数据处理逻辑(比如存库、计算等)
    response_data = {
        'received_content': client_data,
        'message': '数据已成功接收并处理'
    }
    return jsonify(response_data)

if __name__ == '__main__':
    app.run(debug=True)
第二步:原生JavaScript实现AJAX请求

方案1:Fetch API(现代浏览器首选)

发送GET请求

// 发起GET请求获取服务器数据
fetch('/api/data')
    .then(response => {
        // 先检查响应状态是否正常
        if (!response.ok) {
            throw new Error(`请求失败!状态码:${response.status}`);
        }
        // 解析JSON格式的响应体
        return response.json();
    })
    .then(data => {
        // 拿到数据后的业务逻辑,比如渲染到页面
        console.log('从服务器获取的数据:', data);
        document.getElementById('result').innerText = `消息:${data.message} | 物品列表:${data.items.join(', ')}`;
    })
    .catch(error => {
        // 捕获请求过程中的错误(比如网络问题、状态码异常)
        console.error('请求出错:', error);
        document.getElementById('result').innerText = '加载数据失败,请稍后重试';
    });

发送POST请求

// 准备要发送给服务器的数据
const clientSendData = {
    username: '张三',
    age: 28,
    hobby: '编程'
};

fetch('/api/submit', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        // 如果你的Flask开启了CSRF保护,需要添加CSRF Token头(从cookie中获取)
        // 'X-CSRFToken': document.cookie.split('; ').find(row => row.startsWith('csrf_token=')).split('=')[1]
    },
    body: JSON.stringify(clientSendData), // 将JS对象转为JSON字符串
    // 如果需要携带cookie(比如登录态),添加下面的配置
    // credentials: 'same-origin'
})
.then(response => {
    if (!response.ok) {
        throw new Error(`提交失败!状态码:${response.status}`);
    }
    return response.json();
})
.then(data => {
    console.log('服务器响应:', data);
    document.getElementById('submit-result').innerText = data.message;
})
.catch(error => {
    console.error('提交出错:', error);
    document.getElementById('submit-result').innerText = '提交数据失败,请稍后重试';
});

方案2:XMLHttpRequest(兼容老旧浏览器)

发送GET请求

const xhr = new XMLHttpRequest();
// 初始化请求:方法、URL、是否异步(true为异步)
xhr.open('GET', '/api/data', true);

// 请求成功完成后的回调
xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
        // 解析JSON响应
        const data = JSON.parse(xhr.responseText);
        console.log('XMLHttpRequest获取的数据:', data);
        document.getElementById('xhr-result').innerText = `消息:${data.message}`;
    } else {
        console.error('请求失败,状态码:', xhr.status);
    }
};

// 网络请求出错的回调
xhr.onerror = function() {
    console.error('网络连接出错');
};

// 发送请求
xhr.send();

发送POST请求

const xhrPost = new XMLHttpRequest();
xhrPost.open('POST', '/api/submit', true);
// 设置请求头,告诉服务器我们发送的是JSON格式数据
xhrPost.setRequestHeader('Content-Type', 'application/json');
// 若开启CSRF保护,添加CSRF Token头
// xhrPost.setRequestHeader('X-CSRFToken', document.cookie.split('; ').find(row => row.startsWith('csrf_token=')).split('=')[1]);

xhrPost.onload = function() {
    if (xhrPost.status >= 200 && xhrPost.status < 300) {
        const data = JSON.parse(xhrPost.responseText);
        console.log('XMLHttpRequest提交响应:', data);
        document.getElementById('xhr-submit-result').innerText = data.message;
    } else {
        console.error('提交失败,状态码:', xhrPost.status);
    }
};

xhrPost.onerror = function() {
    console.error('网络提交出错');
};

// 转换数据格式并发送
const postData = JSON.stringify({username: '李四', age: 32});
xhrPost.send(postData);
额外注意事项
  • 如果你的Flask应用启用了CSRF保护(比如使用Flask-WTF),发送POST/PUT/DELETE请求时必须携带CSRF Token,代码中我已经添加了相关注释,你可以根据实际情况调整。
  • Fetch API默认不会携带cookie,若需要在请求中传递登录态等cookie信息,需要在fetch的配置项中添加credentials: 'same-origin'(同域)或credentials: 'include'(跨域)。
  • 现代浏览器基本都支持Fetch API,如果需要兼容IE11及更早版本,建议使用XMLHttpRequest方案。

内容的提问来源于stack exchange,提问作者ScandinavianWays

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:23:05