问题描述
因此,基本上我有多个基于if语句的render_template
返回,并且它们返回jinja2模板响应的不同变量。
我相信我可以将这些路由分解为各自的功能(同样,我也可以将模板分解为多个模板(例如,模板中的edit.html模板而不是{% if editform %}
)),但是我喜欢为任何给定页面具有单一视图功能和模板的想法。
在花更多时间创建其余视图函数之前,我想确保以后所做的事情不会对我造成影响。
下面的代码,谢谢!
@app.route('/admin/users/', defaults={'id': None}, methods = ['GET'])
@app.route('/admin/users/<id>', methods = ['GET'])
@app.route('/admin/users/edit/<id>', methods = ['GET', 'POST'])
@login_required
def users(id):
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
if id:
user = User.query.filter_by(id = id).first()
if 'edit' in request.path:
editform = UserForm()
if editform.validate_on_submit():
user.username = editform.username.data
user.email = editform.email.data
user.role = editform.role.data
db.session.add(user)
db.session.commit()
return redirect('/admin/users/' + str(user.id))
editform.username.data = user.username
editform.email.data = user.email
editform.role.data = user.role
return render_template("users.html",
title = "Edit User",
user = user,
editform = editform)
return render_template("users.html",
title = "User",
user = user)
users = User.query.all()
return render_template("users.html",
title = 'Users',
users = users)
1楼
这个问题的答案可能有点取决于个人喜好,但就我个人而言,我会避免这样做。 我的主要理由只是为了使事情保持简单-在该函数内有三个嵌套的if语句,它们基本上与如果拆分视图的flask路由逻辑所执行的工作完全相同。
诚然,目前这不是一个大问题,但是如果您要在任何路径中添加更多逻辑,则可能导致功能异常复杂。 这可能会导致细微的错误,或者只是一眼就很难理解确切的情况。
但是,如果将它们分开,那么一眼便可以清楚地看出每条路线的作用。 甚至不涉及更多代码,因为您可以使用所有if语句:
@app.route('/admin/users/', methods = ['GET'])
def get_all_users():
users = User.query.all()
return render_template("users.html",
title = 'Users',
users = users)
@app.route('/admin/users/<id>', methods = ['GET'])
def get_single_user(id):
user = User.query.filter_by(id = id).first()
return render_template("users.html",
title = "User",
user = user)
@app.route('/admin/users/edit/<id>', methods = ['GET', 'POST'])
def edit_user(id):
editform = UserForm()
if editform.validate_on_submit():
user.username = editform.username.data
user.email = editform.email.data
user.role = editform.role.data
db.session.add(user)
db.session.commit()
return redirect('/admin/users/' + str(user.id))
editform.username.data = user.username
editform.email.data = user.email
editform.role.data = user.role
return render_template("users.html",
title = "Edit User",
user = user,
editform = editform)
编辑:澄清一下-我并不是说每个烧瓶路由都包含多个URL是错误的。 在这种情况下,我认为让一个函数执行三项完全不同的事情是一个坏主意。 我确实利用了每个视图的多个路由的其他用例。 例如,在我自己的代码中,我经常有如下视图:
@migrations_tasks.route('/external_applications', methods=['GET'])
@migrations_tasks.route('/external_applications/<cursor>', methods=['POST'])
def migrate_external_applications(cursor=None, subdomain=None):
... do stuff
替代路由将游标接受到数据库查询中以进行分页。 代码的流程基本相同,只是首页和后续页面的URL不同。
2楼
没有硬性规定,但我建议原则,将多个功能拆分为更多模块。
我什至可以更进一步,并使用 ,其中每条路线都有一个类,其中get,post,post等已从基类覆盖。
当您的函数很小时,看起来还可以,但是当它增长时,一些模块化会有所帮助!