Python 有没有一种方法可以轻松地为Flask中的多个标准页面定义路由?

Python 有没有一种方法可以轻松地为Flask中的多个标准页面定义路由?,python,flask,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("fi

在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']的列表,并从中生成所有这些简单视图吗?

如果
路由
模板
名称匹配,您可以执行以下操作:

@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)
i、 e.从中获取请求的路径,删除不需要的
/
,然后格式化模板名称


编辑

从评论中回答您的问题:

@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)

有没有办法压缩路线列表

我想从评论中对肖恩·维埃拉的回答稍作修改:

@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)
@app.route('/',方法=['GET'])
@需要登录吗
def just_渲染(路径):
如果路径位于['home'、'files'、'about'、'contact']:
模板={file\u name}.html'。格式(file\u name=path)
返回渲染模板(模板)

是的,与Django类似,您可以在Flask中有一个文件来存储集中的URL。这可用于将每个url路由链接到相应的查看功能。根据,您可以按照以下方式进行操作:

视图.py

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

@require_login
def files():
    return render_template("files.html")
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'])
app.py

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

@require_login
def files():
    return render_template("files.html")
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'])

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

@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)

此模式的优点是,每个模板在应用程序中都有自己的端点,因此您可以对('a')使用
url\u,而不是对('template\u route',path='a')
使用
url\u,就像您对上面的path变量所做的那样。

这正是我想要的,非常感谢!有没有办法压缩路线列表?像一个简单的渲染器=['/home','/files'],如果请求是在简单的渲染器中,@app.route(request)之类的东西?是的,把它作为一个参数:
@app.route('/{path}')@require\u-login-def-template\u-route(path):return render\u-template(path+'.html')
再次感谢,这是一个很好的信息,所以我给你投票,但它实际上并没有减少代码量,它仍然是每条路由4行,只是分布在两个文件中。自从@app.route('/home',methods=['GET'])被app.add_url_rule('/home',view_func=views.home,methods=['GET'])取代以来,它实际上是更多的代码。它并没有减少代码量,但它确实使代码更清晰,更易于维护。您已经接受的解决方案工作得很好,但如果您想继续更改任何视图函数、模板名称或URL,则可能会受到限制。