python flask在每条路线上做点什么

时间:2015-03-12 20:07:37

标签: python 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)

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

提前致谢。

1 个答案:

答案 0 :(得分:5)

使用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方法。