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

标签 python flask

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

相关文章:

从列表中获取唯一项的 Pythonic 方法

python - 当我渲染模板时,如何在 Flask 中添加缓存控制?

python - flask url_for() 将参数视为查询字符串

python - Facebook Messenger 与 Flask

rest - Python Eve 自定义端点,但数据从数据库中提取

javascript - 如何从tornado web <python>调用javascript函数?

python - 如何在 xlsxwriter 中将值放置在堆积条形图之外

python - Alembic 使用现有的 SQLAlchemy 引擎迁移

Python的列表理解和其他更好的实践

python - 使用 SQLalchemy 和 Marshmallow 加载一对多关联属性