如何使用带有 Flask 和 Pjax 的 Jinja2 只渲染给定的块
How to render only given block using Jinja2 with Flask and Pjax
我正在寻找一种使用 Flask 和 Pjax 呈现部分模板的便捷方法。我想到了这样的事情:
# utils.py
def render_pjax(base, view, **kwargs):
is_pijax = "X-PJAX" in flask.request.headers
return flask.render_template(
'pjax_wrapper.html', is_pjax=is_pijax, extends=base, view=view, **kwargs)
# pjax_wrapper.html
{% if not is_pjax %}
{% extends extends %}
{% block pjax_content %}
{% include view %}
{% endblock %}
{% else %}
{% include view %}
{% endif %}
这样我就可以像这样定义模板:
# without_pjax.html
<div>
<h1>Search</h1>
(...some static content..)
<div class="content" id="search-results">
{% block pjax_content %}
{% endblock %}
</div>
</div>
# with_pjax.html
<ul>
<li>entry1</li>
<li>entry2</li>
...
<li>entry2</li>
</ul>
并像这样使用它:
# usage
@app.route('/')
def pjax_view():
return render_pjax('without_pjax.html', 'with_pjax.html', context=...)
我的解决方案很方便,没有重复代码的地方,但我仍然必须为每个 pjax 兼容视图使用两个模板。我试图找到更好的方法,最好与这个 Django 库中的方法相同:DjPj。它允许指定我们要渲染哪个块作为对 pjax 请求的响应。我试图在 Flask 中做同样的事情但没有成功。
我真的很感激你能帮我解决这个问题。您能否在 Flask + Jinja2 中模仿 DjPj 的行为,或者可能还有其他我找不到的漂亮解决方案?
好的,我终于创建了这个函数
def pjax(template, pjax_block='pjax_content', **kwargs):
if "X-PJAX" in flask.request.headers:
app = flask.current_app
app.update_template_context(kwargs)
template = app.jinja_env.get_template(template)
block = template.blocks[pjax_block]
context = template.new_context(kwargs)
return u''.join(block(context))
else:
return flask.render_template(template, **kwargs)
如果 pjax header 存在,它只渲染模板中给定的块,否则渲染整个模板。希望对你有帮助。
我正在寻找一种使用 Flask 和 Pjax 呈现部分模板的便捷方法。我想到了这样的事情:
# utils.py
def render_pjax(base, view, **kwargs):
is_pijax = "X-PJAX" in flask.request.headers
return flask.render_template(
'pjax_wrapper.html', is_pjax=is_pijax, extends=base, view=view, **kwargs)
# pjax_wrapper.html
{% if not is_pjax %}
{% extends extends %}
{% block pjax_content %}
{% include view %}
{% endblock %}
{% else %}
{% include view %}
{% endif %}
这样我就可以像这样定义模板:
# without_pjax.html
<div>
<h1>Search</h1>
(...some static content..)
<div class="content" id="search-results">
{% block pjax_content %}
{% endblock %}
</div>
</div>
# with_pjax.html
<ul>
<li>entry1</li>
<li>entry2</li>
...
<li>entry2</li>
</ul>
并像这样使用它:
# usage
@app.route('/')
def pjax_view():
return render_pjax('without_pjax.html', 'with_pjax.html', context=...)
我的解决方案很方便,没有重复代码的地方,但我仍然必须为每个 pjax 兼容视图使用两个模板。我试图找到更好的方法,最好与这个 Django 库中的方法相同:DjPj。它允许指定我们要渲染哪个块作为对 pjax 请求的响应。我试图在 Flask 中做同样的事情但没有成功。
我真的很感激你能帮我解决这个问题。您能否在 Flask + Jinja2 中模仿 DjPj 的行为,或者可能还有其他我找不到的漂亮解决方案?
好的,我终于创建了这个函数
def pjax(template, pjax_block='pjax_content', **kwargs):
if "X-PJAX" in flask.request.headers:
app = flask.current_app
app.update_template_context(kwargs)
template = app.jinja_env.get_template(template)
block = template.blocks[pjax_block]
context = template.new_context(kwargs)
return u''.join(block(context))
else:
return flask.render_template(template, **kwargs)
如果 pjax header 存在,它只渲染模板中给定的块,否则渲染整个模板。希望对你有帮助。