在 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 应用更加简洁高效。