是否可以在Flask,服务器端动态更新渲染模板?

dam*_*ton 14 python json flask

我目前有一个Flask Web服务器,它使用内置的请求对象从JSON API中提取数据.

例如:

def get_data():
    response = requests.get("http://myhost/jsonapi")
    ...
    return response

@main.route("/", methods=["GET"])
def index():
    return render_template("index.html", response=response)
Run Code Online (Sandbox Code Playgroud)

这里的问题是,GET方法自然只运行一次,第一次调用get_data.为了刷新数据,我必须停止并重新启动Flask wsgi服务器.我尝试在一段时间内使用True/sleep循环包装代码的各个部分,但这会阻止werkzeug加载页面.

什么是动态获取我想要的数据而不必重新加载页面或重新启动服务器的最Pythonic方法是什么?

Jon*_*ice 17

你正在讨论可能是两个不同的问题.

  1. 让我们假设问题是你只调用动态数据源get_data()一次并将其(静态)值保持在全局状态response.这个一次性调用没有显示,但让我们说它在你的代码中的某个地方.然后,如果您愿意刷新页面(/)以获取更新,那么您可以:

    @main.route("/", methods=['GET'])
    def index():
        return render_template("index.html", response=get_data())
    
    Run Code Online (Sandbox Code Playgroud)

    这将在每个页面加载时获取新数据.

  2. 然后在问题结束时,您会询问如何"获取我想要的数据而无需重新加载页面或重新启动服务器".这是一个完全不同的问题.您必须在代码中使用AJAX或WebSocket请求.有很多关于如何做到这一点的教程(例如这个)你可以通过谷歌搜索"Flask AJAX"找到.但这需要JavaScript AJAX调用.我建议通过搜索"Flask AJAX jQuery"找到如何完成此操作的示例,因为jQuery将抽象并简化您在客户端需要做的事情.或者,如果您希望使用WebSockets在网页之间实现低延迟连接,这也是可能的; 搜索示例(例如像这样).

  • 将问题分为两个问题的好点子。这回答了我的具体案例和一般问题。这里也值得分享 [Flask-SocketIO](http://flask-socketio.readthedocs.org/)。 (2认同)