Flask-使用decorator和route param使用自定义jinja2标记呈现数据

Flask-使用decorator和route param使用自定义jinja2标记呈现数据,flask,decorator,jinja2,url-parameters,Flask,Decorator,Jinja2,Url Parameters,我想通过decorator和route param的组合向Jinja模板添加元数据标记: 视图: @meta_标签(foo='bar',ping='pong') @app.route(“/some route/”) def动作(缓动): 返回呈现模板('action.html') 模板: 福 {{meta_tags}} ... 目标: 将每个kwargs呈现到其自己的元标记中 将特定于页面的slug呈现到另一个自定义标记中 我意识到实现这一点的一种方法是注册@app.context\u

我想通过decorator和route param的组合向Jinja模板添加元数据标记:

视图:
@meta_标签(foo='bar',ping='pong')
@app.route(“/some route/”)
def动作(缓动):
返回呈现模板('action.html')
模板:

福
{{meta_tags}}
...
目标:

  • 将每个
    kwargs
    呈现到其自己的元标记中
  • 将特定于页面的slug呈现到另一个自定义标记中
我意识到实现这一点的一种方法是注册
@app.context\u processor
,但是我还想找到并使用动态
slug
部分,并创建一个定制的
jinja
标记来呈现
html部分

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

此答案已更新,提供了改进的路线信息和与问题相符的示例

现在有三个例子:-简单,改进和优雅

1.

简单的解决方案是在base.html模板的head部分使用Jinja的Blockcontent函数

base.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 %}" />
已更新…

2.

View.py

@app.route('/some-route/<slug>')
def action(): 
   foo='bar'
   ping='pong'
   return render_template('child.html', foo, ping)
@app.route('/some-route/<slug>')
def action():
   metadata = {'keywords': 'foo', 'description': 'bar'}
   return render_template('child.html', metadata=metadata)
@app.route(“/some route/”)
def action():
foo='bar'
乒乓球
返回呈现模板('child.html',foo,ping)
不确定为什么你的元数据是这里的装饰器,所以改变了我的例子

base.html

<html>
<head>
    {% block metadata %}{% endblock %}
</head>
...
{% extends "base.html" %}
{% block metadata %}
   <meta name="meta_tags" content="{{ foo }}{{ping}}" />
   <meta name="description" content="{{ foo }}" />
   <meta name="keywords" content="{{ ping }}" />
{% endblock %}
{% extends "base.html" %}
    {% block metadata %}
    <ul>
    {% for key, item in metadata.items() %}
       <meta name="{{ key }}" content="{{ item }}" />
    {% endfor %}
    </ul>
{% endblock %}

{%block metadata%}{%endblock%}
...
child.html

<html>
<head>
    {% block metadata %}{% endblock %}
</head>
...
{% extends "base.html" %}
{% block metadata %}
   <meta name="meta_tags" content="{{ foo }}{{ping}}" />
   <meta name="description" content="{{ foo }}" />
   <meta name="keywords" content="{{ ping }}" />
{% endblock %}
{% extends "base.html" %}
    {% block metadata %}
    <ul>
    {% for key, item in metadata.items() %}
       <meta name="{{ key }}" content="{{ item }}" />
    {% endfor %}
    </ul>
{% endblock %}
{%extends“base.html”%}
{%block metadata%}
{%endblock%}
3.

优雅简洁的选择:

View.py

@app.route('/some-route/<slug>')
def action(): 
   foo='bar'
   ping='pong'
   return render_template('child.html', foo, ping)
@app.route('/some-route/<slug>')
def action():
   metadata = {'keywords': 'foo', 'description': 'bar'}
   return render_template('child.html', metadata=metadata)
@app.route(“/some route/”)
def action():
元数据={'keywords':'foo','description':'bar'}
返回呈现模板('child.html',元数据=元数据)
注意:base.html保持不变

child.html

<html>
<head>
    {% block metadata %}{% endblock %}
</head>
...
{% extends "base.html" %}
{% block metadata %}
   <meta name="meta_tags" content="{{ foo }}{{ping}}" />
   <meta name="description" content="{{ foo }}" />
   <meta name="keywords" content="{{ ping }}" />
{% endblock %}
{% extends "base.html" %}
    {% block metadata %}
    <ul>
    {% for key, item in metadata.items() %}
       <meta name="{{ key }}" content="{{ item }}" />
    {% endfor %}
    </ul>
{% endblock %}
{%extends“base.html”%}
{%block metadata%}
    {%用于键,元数据中的项。项()%} {%endfor%}
{%endblock%}

有关Jinja模板的更多信息,请使用块内容和模板继承,网址:

解决方案是将块添加到base.html中的元字段中

base.html文件应该如下所示

<html>
  <head>
    <meta name="slug" content="{% block slug %}{% if slug %}{{slug}}{%else%}Some sane defaults if needed{% endif %}{% endblock %}" />
</html>
所以,如果在render_模板函数中传递slug,它将自动添加到元字段中。 或者,您可以在子模板中通过添加

{% block slug %}value{% endblock %}

您是否有理由宁愿用它来装饰函数,而不是将meta
kwargs
传递到
render_模板
?它仍然在代码的同一区域,只是语法不同。您能解释一下在应用程序中使用多个参数设置路由的语法吗?我认为用户询问了如何动态地提供元标记,而不是从模板继承的文档中,看起来您将child.html作为静态文件。