我有一个 flask 应用程序,我必须在其中删除和更新用户信息,就像这样(简化):
@app.route('/<user>')
def show_user(user):
""" Show user information """
render_template('show_user.html')
@app.route('/delete/<user>')
def delete_user(user):
""" Delete user from database """
delete_user_from_db(user)
return redirect(url_for('show_users', user=user)
@app.route('/update/<user>', method=["POST"])
def update_user(user):
""" Update user information """
update(user, stuff_from_POST)
return redirect(url_for('show_users', user=user)
对于这些方法中的每一个,我都需要验证 URL 中指定的 user
是否真的是一个有效用户,所以我会在所有这些函数的开头做这样的事情:
if user not in mydb:
do(something)
abort(404)
这相当麻烦,而且由于我将拥有更多取决于用户的有效函数,我想知道是否有可能将该 block 包装在另一个函数中,该函数在调用这些路由时自动执行。
提前致谢。
最佳答案
使用before_request
钩子(Hook)函数见docs
@app.before_request
def before_request():
if user not in mydb:
do(something)
abort(404)
编辑:
我试过了
from flask import Flask, request
app = Flask(__name__)
db = ['paul', 'steve', 'anna']
@app.before_request
def before_request():
if request.endpoint in ['show_user', 'delete_user', 'update_user']:
user = request.path[request.path.rfind('/') + 1:]
if user not in db:
return 'user not found', 404
@app.route('/<user>')
def show_user(user):
""" Show user information """
return 'hello %s' % user
@app.route('/other')
def show_other():
""" Demonstrates other routes are not effected by before_request """
return 'other stuff'
if __name__ == "__main__":
app.run()
它实际上并没有我希望的那么整洁,但它确实有效。
不得不在 before_request
函数中维护哪些端点执行哪些操作有点不幸。如果你在做 REST您或许能够将这些端点合并为一个,并为每个操作简单地使用不同的 http 方法。
关于python flask 在每条路线上做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29019255/