最常用的 Flask 装饰器
Flask 作为一个轻量级的 Python Web 框架,其核心设计理念之一就是大量使用装饰器。装饰器不仅让代码更加简洁优雅,还能将不同的功能模块(如路由、权限校验、错误处理等)巧妙地解耦。本文将详细介绍 Flask 开发中最常用的装饰器及其应用场景。
1. @app.route — 路由装饰器
这是 Flask 中最基础、使用频率最高的装饰器。它用于将一个 URL 规则绑定到一个视图函数上。当用户访问对应的 URL 时,Flask 就会调用被该装饰器修饰的函数。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, Flask!'
@app.route('/user/')
def show_user_profile(username):
return f'User {username}'2. @app.before_request — 请求前处理
该装饰器用于注册一个在每次请求发生之前执行的函数。它非常适合用于身份验证、权限检查、数据库连接初始化等前置逻辑。如果该函数返回了一个非 None 的值,请求将被中断,并直接返回该值作为响应。
@app.before_request
def check_login():
# 假设我们有一个检查用户是否登录的逻辑
if not session.get('user_logged_in') and request.endpoint != 'login':
return redirect(url_for('login'))3. @app.after_request — 请求后处理
该装饰器注册的函数会在每次请求结束后执行,且必须接收一个响应对象作为参数,并返回一个响应对象。它常用于修改响应头(如添加 CORS 头信息)、记录日志或设置 Cookie。
@app.after_request def add_cors_headers(response): response.headers['Access-Control-Allow-Origin'] = 'www.ipipp.com' response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' return response
4. @app.teardown_request — 请求结束时清理
无论请求过程中是否抛出异常,被 @app.teardown_request 修饰的函数都会在请求上下文被销毁前执行。它主要用于资源的清理工作,如关闭数据库连接、释放文件句柄等。该函数接收一个异常对象作为参数,如果没有异常则为 None。
@app.teardown_request def close_db_connection(exception): db = getattr(g, 'db', None) if db is not None: db.close()
5. @app.errorhandler — 错误处理
当应用抛出特定异常或遇到特定 HTTP 状态码时,可以使用该装饰器注册自定义的错误处理函数。这能让用户在遇到 404 或 500 错误时,看到更加友好的页面。
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_server_error(error):
return render_template('500.html'), 5006. @app.template_filter — 自定义模板过滤器
在 Jinja2 模板中,我们经常使用过滤器来格式化数据(如 {{ name | capitalize }})。使用 @app.template_filter 可以轻松地在 Flask 中注册自定义的过滤器。
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
# 在模板中可以这样使用:{{ "hello" | reverse }}7. @app.context_processor — 上下文处理器
在开发中,我们经常需要在所有模板中共享某些变量(如网站名称、当前登录用户信息等)。使用 @app.context_processor 装饰的函数,其返回值的字典内容将自动注入到所有模板的上下文中。
@app.context_processor def inject_globals(): return dict(site_name='My Awesome Site', current_user=get_current_user())
8. 自定义装饰器 — 权限校验利器
除了 Flask 内置的装饰器,我们还可以结合 functools.wraps 编写自定义装饰器,以实现代码复用。例如,限制某些接口只能由管理员访问。
from functools import wraps
from flask import abort, session
def admin_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not session.get('is_admin'):
abort(403) # Forbidden
return f(*args, **kwargs)
return decorated_function
@app.route('/admin/dashboard')
@admin_required
def admin_dashboard():
return 'Welcome to Admin Dashboard'总结
Flask 的装饰器机制极大地增强了代码的可读性和可维护性。通过合理使用路由、请求钩子、错误处理以及自定义装饰器,开发者可以像搭积木一样构建出结构清晰、功能强大的 Web 应用。掌握这些最常用的装饰器,是迈向高效 Flask 开发的必经之路。