有没有办法在Flask中轻松定义多个标准页面的路线?

时间:2016-01-13 20:57:37

标签: python flask

在Flask中创建一个Web应用程序时,我发现我有一个很大的视图列表,看起来完全像这样:

@app.route('/home', methods=['GET'])
@require_login
def home():
    return render_template("home.html")

@app.route('/files', methods=['GET'])
@require_login
def files():
    return render_template("files.html")

有没有什么方法可以制作像''home','files'这样的列表并从中生成所有这些简单的视图?

3 个答案:

答案 0 :(得分:2)

如果routestemplates名称匹配,您可以执行以下操作:

@app.route('/home', methods=['GET'])
@app.route('/files', methods=['GET'])
@require_login
def just_render():
    file_name = request.path.replace('/', '')
    template = '{file_name}.html'.format(file_name=file_name)

    return render_template(template)

即。从request.path获取请求的路径,删除不需要的/,然后格式化模板名称。


修改

从评论中回答你的问题:

  

有什么方法可以压缩路线列表吗?

我会从评论中修改一下 @Sean Vieira 的答案:

@app.route('/<path>', methods=['GET'])
@require_login
def just_render(path):
    if path in ['home', 'files', 'about', 'contact']:
         template = '{file_name}.html'.format(file_name=path)
         return render_template(template)

答案 1 :(得分:2)

是的,与Django类似,您可以在Flask中存储用于存储集中式URL的文件。这可用于将每个URL路由链接到相应的视图功能。根据{{​​3}},您可以按以下方式执行操作:

<强> views.py

@require_login
def home():
    return render_template("home.html")

@require_login
def files():
    return render_template("files.html")

<强> app.py

from flask import Flask
from myapp import views

app = Flask(__name__)

app.add_url_rule('/home', view_func=views.home, methods=['GET'])
app.add_url_rule('/files', view_func=views.files, methods=['GET'])

答案 2 :(得分:1)

最简单的方法是使用路径变量:

@app.route('/{path}')
@require_login
def template_route(path):
    return render_template(path + '.html')

这使得公开新模板变得容易,而无需编写额外的处理程序,这些处理程序反复重复相同的逻辑。

另一种方法是建立工厂:

def TemplateRenderer(app):
    def register_template_endpoint(name):
        @app.route('/' + name, endpoint=name)
        @require_login
        def route_handler():
            return render_template(name + '.html')
    return register_template_endpoint

然后您可以按如下方式使用它:

register_template_endpoint = TemplateRenderer(app)
for path in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']:
    register_template_endpoint(path)

此模式的优点是每个模板在您的应用程序中都有自己的端点,因此您可以像上面的路径变量一样使用url_for('a')而不是url_for('template_route', path='a')