gpt4 book ai didi

Flask - 使用装饰器和路由参数来渲染带有自定义 jinja2 标签的数据

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

我想通过装饰器和路由参数的组合向 Jinja 模板添加元数据标签:

看法:

@meta_tags(foo='bar', ping='pong')
@app.route('/some-route/<slug>')
def action(slug):
return render_template('action.html')

模板:
<html>
<head>
<title>Foo</title>
{{ meta_tags }}
<!--
should render:
<meta name="slug" content="[actual-slug]" />
<meta name="foo" content="bar" />
<meta name="ping" content="pong" />
-->
</head>
...

目标:
  • 将每个 kwargs 渲染到它自己的元标记中。
  • 将特定于页面的 slug 渲染到另一个自定义标记中。

  • 我意识到实现此目的的一种方法涉及注册 @app.context_processor ,但随后我还想捕获并使用动态 slug 部分并创建一个自定义 jinja 标记来呈现 <meta> html 部分。

    什么是惯用的 Flask 解决方法?谢谢。

    最佳答案

    此答案已更新,其中包含有关路由的改进信息和与问题一致的示例。
    现在有三个例子: - 简单,改进和优雅。
    1.
    简单的解决方案是在 base.html 模板的 head 部分中使用 Jinja 的 内容功能。
    基地.html:

    <meta name="description" content="{% block description %}{% endblock %}" />
    <meta name="keywords" content="{% block keywords %}{% endblock %}" />
    <meta name="author" content="{% block author %}{% endblock %}" />
    <meta name="foo" content="{% block bar %}{% endblock %}" />
    然后从任何 child.html 您可以设置块内容,如下所示:
    {% block description %}description from your child page.{% endblock %}
    {% block keywords %}website, blog, coding{% endblock %}
    {% block author %} {{ author.fullname }} {% endblock %}
    {% block bar %}foo bar content{% endblock %}
    已更新...
    2.
    View.py
    @app.route('/some-route/<slug>')
    def action():
    foo='bar'
    ping='pong'
    return render_template('child.html', foo, ping)
    不知道为什么你的 meta_data 是这里的装饰器,所以改变了我的例子。
    base.html
    <html>
    <head>
    {% block metadata %}{% endblock %}
    </head>
    ...
    child.html
    {% extends "base.html" %}
    {% block metadata %}
    <meta name="meta_tags" content="{{ foo }}{{ping}}" />
    <meta name="description" content="{{ foo }}" />
    <meta name="keywords" content="{{ ping }}" />
    {% endblock %}
    3.
    优雅简洁的替代品:
    View.py
    @app.route('/some-route/<slug>')
    def action():
    metadata = {'keywords': 'foo', 'description': 'bar'}
    return render_template('child.html', metadata=metadata)
    注意:base.html 保持不变。
    child.html
    {% extends "base.html" %}
    {% block metadata %}
    <ul>
    {% for key, item in metadata.items() %}
    <meta name="{{ key }}" content="{{ item }}" />
    {% endfor %}
    </ul>
    {% endblock %}
    更多信息可以在 Jinja 模板上找到,使用块内容和模板继承: http://jinja.pocoo.org/docs/dev/templates/#template-inheritance

    关于Flask - 使用装饰器和路由参数来渲染带有自定义 jinja2 标签的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29053671/

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