【问题标题】:How to render only given block using Jinja2 with Flask and Pjax如何使用带有 Flask 和 Pjax 的 Jinja2 仅渲染给定的块
【发布时间】:2015-09-10 22:22:41
【问题描述】:

我正在寻找一种使用 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 的行为吗,或者也许还有其他我找不到的漂亮解决方案?

【问题讨论】:

    标签: jquery python flask jinja2 pjax


    【解决方案1】:

    好的,最后我创建了这个函数

    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 标头,它只渲染模板中的给定块,否则渲染整个模板。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多