创建Flask视图,呈现不同的模板而不重复代码

时间:2017-04-06 17:54:43

标签: python flask

我想定义多个呈现不同模板的端点,而不是写出每个模板。端点都是相似的,一个看起来像:

    @app.route('/dashboard/')
    def dashboard():
        return render_template('endpoints/dashboard.html')

我尝试在每个端点名称的for循环中定义一个函数,但问题是该函数的名称保持不变,而Flask引发了一个错误。

routes = ['dashboard', 'messages', 'profile', 'misc']

for route in routes:
    @app.route('/' + route + '/')
    def route():
        return render_template('endpoints/' + route + '.html')

如何在不重复的情况下创建这些视图?

1 个答案:

答案 0 :(得分:2)

你不想这样做。相反,在路径中使用变量来捕获模板名称,尝试渲染模板,如果模板不存在则返回404错误。

from flask import render_template, abort
from jinja2 import TemplateNotFound

@app.route('/<page>/')
def render_page(page):
    try:
        return render_template('endpoints/{}.html'.format(page))
    except TemplateNotFound:
        abort(404)

或者,不太优选的是,只要为Flask提供唯一的端点名称,就可以使用相同的函数名称。默认名称是函数的名称,这就是Flask抱怨的原因。

for name in routes:
    @app.route('/', endpoint=name)
    def page():
        return render_template('endpoints/{}.html'.format(name))