You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python后端POST数据至Flask前端及前端GET获取的问题求助

解决Flask前后端对接的连接拒绝问题及正确的数据传递思路

看起来你踩了两个常见的Flask坑:一是在应用还没启动的时候就尝试向自己发请求,二是对前后端数据传递的思路有点走偏了。我来一步步帮你解决:

为什么会出现连接拒绝错误?

你在__init__.py里直接调用requests.post("http://localhost:5000/getjson", json=message)的时候,Flask应用还没有真正启动运行——这时候localhost:5000端口根本没有服务在监听,自然会被目标机器拒绝连接。__init__.py是用来初始化应用的,这个阶段服务还没开始接收请求呢!

正确的前后端数据传递思路

你不需要让后端主动POST数据到前端,应该换两种更合理的方式:要么在渲染模板时直接把数据传给前端,要么提供一个API接口让前端主动去获取。

方案一:渲染模板时直接传入数据(适合简单场景)

这种方式最直接,后端在渲染页面的时候把数据一起传给模板,前端直接就能用。

  1. 修改__init__.py,把数据处理逻辑封装成函数,方便其他模块调用:
from flask import Flask
import json

app = Flask(__name__)

def generate_message():
    # 这里替换成你实际生成dicts的逻辑
    dicts = {"status": "success", "data": ["item1", "item2", "item3"]}
    return json.dumps(dicts)

from app import routes
  1. 更新routes.py,在渲染index页面时传入生成的message:
from flask import render_template
from app import app, generate_message

@app.route('/')
@app.route('/index')
def index():
    user = {'username': 'Me'}
    # 调用函数获取数据
    message = generate_message()
    return render_template('index.html', title='Home', user=user, message=message)
  1. 修改index.html,直接使用后端传来的数据:
<html>
<head>
<title>{{ title }} - Status Checker</title>
<script>
// 把后端传的JSON字符串转成JS对象,注意用|safe防止转义
const messageData = JSON.parse('{{ message|safe }}');

// 页面加载完成后做可视化
document.addEventListener('DOMContentLoaded', function() {
    const container = document.createElement('div');
    container.innerHTML = `<h3>获取到的数据:</h3><pre>${JSON.stringify(messageData, null, 2)}</pre>`;
    document.body.appendChild(container);
});
</script>
</head>
<body>
<h1>Hello, {{ user.username }}!</h1>
</body>
</html>

方案二:提供API接口让前端AJAX获取(适合复杂交互场景)

如果你的可视化需要异步加载,或者数据会动态更新,这种方式更合适。

  1. 同样先修改__init__.py封装数据生成函数(和方案一一样)。

  2. 更新routes.py,添加专门的接口返回JSON数据:

from flask import render_template, jsonify
import json
from app import app, generate_message

@app.route('/')
@app.route('/index')
def index():
    user = {'username': 'Me'}
    return render_template('index.html', title='Home', user=user)

# 提供GET接口返回JSON数据
@app.route('/getjson', methods=['GET'])
def getjson():
    message_str = generate_message()
    # 把JSON字符串转回字典,用jsonify返回标准的JSON响应
    return jsonify(json.loads(message_str))
  1. 修改index.html,用fetch API请求接口获取数据:
<html>
<head>
<title>{{ title }} - Status Checker</title>
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 异步请求后端接口
    fetch('/getjson')
        .then(response => {
            if (!response.ok) throw new Error('请求失败');
            return response.json();
        })
        .then(data => {
            // 这里写你的可视化逻辑,比如渲染图表、表格等
            const container = document.createElement('div');
            container.innerHTML = `<h3>异步获取的数据:</h3><pre>${JSON.stringify(data, null, 2)}</pre>`;
            document.body.appendChild(container);
        })
        .catch(error => console.error('出错了:', error));
});
</script>
</head>
<body>
<h1>Hello, {{ user.username }}!</h1>
</body>
</html>

最后启动应用的正确方式

确保你的check.py是用来启动应用的:

from app import app

if __name__ == '__main__':
    app.run(debug=True)

然后通过python check.py启动服务,这时候localhost:5000才会有服务监听,前端请求也能正常响应了。

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

火山引擎 最新活动