gpt4 book ai didi

flask - 如何使用 Flask/Python/Jinja 尽早刷新

转载 作者:行者123 更新时间:2023-12-03 16:12:42 24 4
gpt4 key购买 nike

您可以立即发送 HTML 响应的第一部分(例如包含 JS/CSS 链接的 <head>..</head>),同时计算响应的其余部分,从而使网站看起来更快。 (参见 http://www.stevesouders.com/blog/2009/05/18/flushing-the-document-early/)

在 Flask 中执行此操作的好方法是什么?

我看到 Flask 支持流式传输 ( http://flask.pocoo.org/docs/0.10/patterns/streaming/ ),所以我认为这应该是可能的,但我想知道是否有人找到了一种干净的方法来将所有部分拼接在一起。例如,您如何构建 Jinja 模板以便尽早提取/刷新文档的各个部分?

最佳答案

它并不完美,但我正在尝试以下方法。我有一个装饰器:

def early_flush_of_head(template_name):
def wrapper(original_view_function):

@wraps(original_view_function)
def new_view_function(*args, **kwargs):
def streamer():
yield render_template(template_name, head_only=True)
yield original_view_function(*args, **kwargs)

return Response(stream_with_context(streamer()))
return new_view_function
return wrapper

您可以使用它来装饰给定的 View ,如下所示:

@app.route('/')
@early_flush_of_head('template.html')
def index():
data = something_time_consuming() # DB traffic or maybe some crazy calculations

return render_template('template.html', data=data)

每个 template.html 看起来像这样:

{% extends "base.html" %}

{% block pre_flush_head %}
<link href="static/css/page.min.css" rel="stylesheet">
<script src="static/js/page.min.js"></script>
{% endblock %}

{% block post_flush_head %}
<title>{{ page_name }}</title>
{% endblock %}

{% block content %}
The actual page.
{% endblock %}

base.html 看起来像这样:

{% if head_only %}
<!DOCTYPE html>
<html lang="en">
<head>
<link href="static/css/common.min.css" rel="stylesheet">
<script src="static/js/common.min.js"></script>
{% else %}
{% block post_flush_head %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
{% endif %}

每个模板实际上被渲染了两次。一旦在 head_only=True 的装饰器中,然后又没有在真实 View 函数中定义它。另请注意,我没有冲洗整个头部,头部有一些东西但仍然需要来自真实 View 函数的数据。如果您根据数据命名页面,标题就是一个很好的例子。

这里有一些改进的余地(我不喜欢你必须把模板的名字写两次,而且它总体上有点干扰),但它确实让你受益于早期刷新(make确保您的部署环境不会在您不知情的情况下进行缓冲)。

关于flask - 如何使用 Flask/Python/Jinja 尽早刷新 <head>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27160551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com