用于在烧瓶视图中生成URL模式的Jinja2过滤器

时间:2015-06-05 18:37:29

标签: python flask jinja2

我正在开发一个小型Flask应用程序来呈现有关Cinema的数据。每个电影院都有两个与自身相关的类别

  1. 语言 - 该电影的语言。例如。英语,法语
  2. 类型 - 例如动作,喜剧,悬疑
  3. 用户案例 - 有一个名为Inception的电影院,其格式为English,属于Suspense类型。我想为Inception电影的页面构建干净的网址,例如 projectdomain.com/english/suspense/inception

    目前我正在通过blueprint.context_processor进行此操作。

    @blueprint.context_processor:
    def cinema_processor():
        def clean_cinema_name(cinema):
            return '{0} / {1} / {2}'.format(cinema['language'], cinema['genre'],
    cinema['name'])
    

    但是我想在jinja2自定义过滤器中执行此操作 - 我猜这会更容易。

    如果有人已经进行了jinja2自定义过滤,请随时为我提供帮助。

    到目前为止,您可以安全地假设 - 一个电影院名称只属于一种语言和类型。

1 个答案:

答案 0 :(得分:1)

这里是如何解决Jinja2过滤器方面的问题。

server.py:

import flask
app = flask.Flask(__name__)

def cinema_url(cinema):
    return '/%s/%s/%s' % ( 
            cinema['language'],
            cinema['genre'],
            cinema['name'],
            )

# Register this function as a Jinja2 filter
app.jinja_env.filters['cinema_url'] = cinema_url

@app.route('/')
def home():
    cinemas = [ 
            {'name': 'Movie1', 'language': 'English', 'genre': 'action'},
            {'name': 'Movie2', 'language': 'Spanish', 'genre': 'comedy'},
        ]
    return flask.render_template('home.html', cinemas=cinemas)

app.run()

模板/ home.html的:

h1>Home</h1>

{% for cinema in cinemas %}
<li>
{# make use of the filter to create your URL #}
<a href="{{cinema|cinema_url}}">{{cinema['name']}}</a>
</li>
{% endfor %}

请参阅http://flask.pocoo.org/docs/0.10/templating/#registering-filters

您是否也需要路由帮助?