flask一些特殊装饰器

发布时间 2023-11-26 14:44:12作者: __username

直接上代码了

"""
# @Time    : 2023/11/26
# @Author  : bgm
# @File    : mange.py
"""
from flask import Flask, abort, request, g, jsonify

app = Flask(__name__)


# @app.before_first_request  # 3.0版本之后已经弃用
# ---------------------------------------------------这个有点问题
@app.before_request
def before_first_request():
    if not hasattr(g, 'first_request_done'):
        print('This will run only once, before the first request')
        g.first_request_done = True



@app.before_request
def before_request():
    print('before_request')
    # 获取用户身份信息(这是一个简化的例子)
    # user_id = request.headers.get('X-User-Id')  # 请求头没这个
    user_id = request.headers.get('User-Agent')

    # 进行用户身份验证逻辑
    if not user_id:
        # # 如果没有用户身份信息,返回 401 Unauthorized
        # abort(401)
        # 如果未提供用户ID,可能要返回更详细的响应。
        return jsonify({'error': '未经授权'}), 401

# 注册一个处理 401 错误的函数
@app.errorhandler(401)
def page_not_found(error):
    # return 'Unauthorized', 401
    return jsonify({'error': '未经授权'}), 401

@app.after_request
def after_request(response):
    print('After Request')
    # 可以在这里进行一些后处理操作,比如添加响应头或修改响应内容
    #---------------------------------------------------响应头
    # 在响应头中添加自定义信息
    response.headers['X-Custom-Header'] = 'Custom Value'
    #---------------------------------------------------响应内容
    # 获取原始的响应内容
    original_content = response.get_data(as_text=True)

    # 在原始内容后面添加一段字符串
    modified_content = f'{original_content} - Modified Content'

    # 将修改后的内容重新设置给响应对象
    response.set_data(modified_content)
    #---------------------------------------------------返回
    # 返回修改后的响应
    return response


@app.teardown_request
def teardown_request(exception):
    print('Teardown Request')
    # 在这里进行一些清理操作,比如关闭数据库连接


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        return 'This is a POST request'
    else:
        return 'This is a GET request' + ' Hello world!'


@app.route('/user/<username>', defaults={'page': 1})
@app.route('/user/<username>/page/<int:page>')
def user(username, page):
    return f'User: {username}, Page: {page}'


@app.route('/error')
def trigger_error():
    # 如果某些条件不符合预期,中断请求并返回 404 错误
    abort(404)

# 注册一个处理 404 错误的函数
@app.errorhandler(404)
def page_not_found(error):
    return 'page not found', 404


@app.cli.command('initdb')  # 用于注册自定义的命令行命令。  # flask initdb
def initdb_command():
    """初始化数据库。"""
    # 在这里包含实际的数据库初始化逻辑
    print('数据库已初始化')


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)