python flask 在每条路线上做一些事情

python flask do something at each route

我有一个 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)

这相当麻烦,因为我将拥有更多取决于用户的有效函数,我想知道是否可以将该块包装在另一个函数中,该函数在调用这些路由时自动执行.

提前致谢。

使用before_request钩子函数见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 方法。