【发布时间】:2014-04-20 01:53:04
【问题描述】:
所以基本上我有多个基于 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)
【问题讨论】:
-
Flask 应用程序应尽可能模块化,以便尽可能轻松地重复使用或扩展它们。你做事的方式会起作用,但考虑使用blueprints。一般来说,如果我在烧瓶视图中进入第三级条件,我预计它会在以后伤害我。
-
您可以使用多个 URL,但这不是您想要的方式。那是许多不同的动作。如果它对多个嵌套项执行相同的操作,那么是的,您可以使用多个。如下所述,简单是关键,即使这意味着多条路线
-
@SteveRossiter 感谢您对蓝图的提醒。在这一点上,这些东西有点让我头疼,但现在我知道它存在。
标签: python flask flask-sqlalchemy flask-wtforms