Flask-使用decorator和route param使用自定义jinja2标记呈现数据
我想通过decorator和route param的组合向Jinja模板添加元数据标记: 视图: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
@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作为静态文件。