如何使用带有Flask和Pjax的Jinja2只渲染给定的块

2024-09-30 10:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种使用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 %}

这样我就可以定义这样的模板: 在

^{pr2}$

然后像这样使用它: 在

# usage
@app.route('/')
def pjax_view():
    return render_pjax('without_pjax.html', 'with_pjax.html', context=...)

我的解决方案非常方便,没有代码被复制的地方,但是我仍然必须为每个pjax兼容的视图使用两个模板。我试图找到更好的方法,最好和Django的这个库相同:DjPj。它允许指定我们想要呈现哪个块作为对pjax请求的响应。我试着在烧瓶里做同样的事,但没有成功。在

如果你能帮我解决这个问题,我会非常感激的。你能在Flask+Jinja2中模仿DjPj的行为吗,或者也许还有其他我找不到的漂亮解决方案?在


Tags: 方法view模板flaskbasereturnisdef
1条回答
网友
1楼 · 发布于 2024-09-30 10:29:20

最后,我创建了这个函数 在

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头存在,它只呈现来自模板的给定块,否则呈现整个模板。希望有帮助。在

相关问题 更多 >

    热门问题