在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'这样的列表并从中生成所有这些简单的视图?
答案 0 :(得分:2)
如果routes
和templates
名称匹配,您可以执行以下操作:
@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')
。