Skip to main content
 首页 » 编程设计

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

2025年05月04日46zengkefu

我有一个 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 方法。