Flask中常用的装饰器

Flask 中,装饰器(decorators)是对函数的修饰,通常用来处理请求、路由、授权、缓存等功能。以下是一些 常见的 Flask 装饰器,按功能分类,并附带示例代码。


1. 路由装饰器

(1)@app.route()

  • 用于将 URL 路由与视图函数关联。
  • methods 参数指定允许的 HTTP 方法。
@app.route('/')
def home():
    return "Hello, Flask!"

@app.route('/hello/<name>', methods=['GET'])
def greet(name):
    return f"Hello, {name}!"
  • 示例@app.route('/login', methods=['POST', 'GET'])

(2)@app.get() / @app.post()

  • Flask 2.x 支持的简洁版本,用于绑定 HTTP 方法。
@app.get('/')
def get_home():
    return "GET Request - Home"

@app.post('/submit')
def post_form():
    return "POST Request - Form Submitted"

2. 请求钩子装饰器

(1)@app.before_request

  • 在每个请求之前执行的函数。
@app.before_request
def before_request():
    print("This runs before every request.")

(2)@app.after_request

  • 在每个请求之后执行的函数。必须返回响应对象
@app.after_request
def after_request(response):
    print("This runs after every request.")
    return response

(3)@app.teardown_request

  • 请求结束时执行(即使出现异常)。不需要返回响应对象。
@app.teardown_request
def teardown_request(exception):
    print("This runs after the request is completed.")

3. 错误处理装饰器

(1)@app.errorhandler()

  • 用于处理 HTTP 错误代码。
@app.errorhandler(404)
def not_found(error):
    return "Page not found!", 404

@app.errorhandler(500)
def internal_error(error):
    return "Internal Server Error", 500

4. 认证和授权装饰器

(1)@login_required(来自 flask_login

  • 用于保护某些路由,要求用户必须先登录。
from flask_login import login_required

@app.route('/dashboard')
@login_required
def dashboard():
    return "Welcome to your dashboard!"

(2)@roles_required(自定义装饰器)

  • 用于检查用户是否具有某个角色。
def roles_required(role):
    def wrapper(fn):
        @wraps(fn)
        def decorated_view(*args, **kwargs):
            if not current_user.has_role(role):
                return "Permission denied", 403
            return fn(*args, **kwargs)
        return decorated_view
    return wrapper

@app.route('/admin')
@roles_required('admin')
def admin_dashboard():
    return "Welcome, Admin!"

5. 视图函数装饰器

(1)@app.before_first_request

  • 在应用启动并处理第一次请求时执行的函数。
@app.before_first_request
def before_first_request():
    print("This runs before the first request only.")

(2)@app.context_processor

  • 用于在模板上下文中添加变量。
@app.context_processor
def inject_user():
    return dict(user="Admin")

(3)@app.template_filter()

  • 用于创建自定义的模板过滤器。
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

6. 异常处理装饰器

(1)@app.after_request

  • 可以用于处理异常或对返回的响应进行修改。
@app.after_request
def add_header(response):
    response.headers["X-Content-Type-Options"] = "nosniff"
    return response

7. 缓存装饰器(Flask-Caching)

(1)@cache.cached()

  • 缓存视图的响应,减少对数据库或服务的请求。
from flask_caching import Cache

cache = Cache(app)

@app.route('/some_data')
@cache.cached(timeout=50)
def some_data():
    return "This data is cached for 50 seconds."

8. 自定义装饰器

  • 装饰器不仅可以用来做标准功能处理,还可以自定义,来处理任何特殊需求。
  • 比如验证参数、统计时间等。
def timing_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time} seconds")
        return result
    return wrapper

@app.route('/timed')
@timing_decorator
def timed_route():
    time.sleep(2)
    return "This route is timed!"

总结

Flask 提供了多种 内置装饰器,可以方便地在 视图函数请求生命周期错误处理缓存认证授权 等场景中使用,增强应用的功能性和灵活性。

常见装饰器:

  • 路由装饰器@app.route()
  • 请求钩子装饰器@app.before_request@app.after_request@app.teardown_request
  • 错误处理装饰器@app.errorhandler()
  • 认证和授权装饰器@login_required
  • 模板和视图装饰器@app.context_processor@app.template_filter
  • 自定义装饰器@wraps

根据实际需求灵活使用这些装饰器,可以让 Flask 应用更加简洁高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BirdMan98

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值