Flask中的装饰器
在 Flask 中,装饰器(Decorator)是一种 Python 语法特性,它允许你在不修改原始函数的情况下,扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。
1. Flask 装饰器的基本概念
Python 的装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。例如:
def my_decorator(f):
def wrapper():
print("调用前")
f()
print("调用后")
return wrapper
@my_decorator
def say_hello():
print("Hello, Flask!")
say_hello()
执行 say_hello()
时,输出:
调用前
Hello, Flask!
调用后
这里 @my_decorator
等价于 say_hello = my_decorator(say_hello)
2. Flask 中常见的装饰器
Flask 提供了一系列装饰器用于不同的功能,最常见的包括:
- 路由装饰器
- 请求前/后处理装饰器
- 错误处理装饰器
- Flask 扩展提供的装饰器
2.1 路由装饰器 @app.route
Flask 使用 @app.route
装饰器来注册 URL 路由,使某个函数在访问特定 URL 时被调用。
from flask import Flask
app = Flask(__name__)
@app.route('/') # 访问根路径时执行
def home():
return "欢迎来到 Flask 首页"
@app.route('/about')
def about():
return "关于页面"
if __name__ == '__main__':
app.run(debug=True)
这里的 @app.route('/')
本质上是 app.add_url_rule('/', 'home', home)
的简化写法。
2.2 处理 HTTP 请求方法
默认情况下,@app.route
只允许 GET
请求,你可以使用 methods
参数指定多个方法:
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
return "收到 POST 请求"
return "收到 GET 请求"
2.3 @app.before_request
& @app.after_request
Flask 允许你在每个请求处理之前或之后执行代码,可以用来做权限校验、日志记录等。
(1) @app.before_request
@app.before_request
在请求到达视图函数之前执行,适合用来验证权限、日志记录等。
from flask import request
@app.before_request
def before_request_func():
print(f"正在处理请求: {request.path}")
(2) @app.after_request
@app.after_request
在视图函数执行后,返回响应之前执行,适合用来修改响应。
@app.after_request
def after_request_func(response):
response.headers["X-Custom-Header"] = "FlaskDemo"
return response
2.4 @app.errorhandler
用于处理特定的 HTTP 错误,例如 404、500。
@app.errorhandler(404)
def not_found_error(error):
return "页面未找到", 404
3. 自定义 Flask 装饰器
除了 Flask 内置的装饰器,你也可以自定义装饰器,例如:检查用户是否登录。
from flask import request, jsonify
def login_required(f):
def wrapper(*args, **kwargs):
token = request.headers.get("Authorization")
if not token:
return jsonify({"error": "未授权"}), 401
return f(*args, **kwargs)
return wrapper
@app.route('/protected')
@login_required
def protected():
return jsonify({"message": "成功访问受保护资源"})
当访问 /protected
时,如果请求头没有 Authorization
,返回 401。
4. Flask 扩展中的装饰器
Flask 生态系统中的很多扩展也使用了装饰器,例如:
- Flask-Login:
@login_required
- Flask-CORS:
@cross_origin()
- Flask-RESTful:
@marshal_with()
- Flask-Cache:
@cache.cached(timeout=60)
示例(使用 Flask-Login
扩展):
from flask_login import login_required
@app.route('/dashboard')
@login_required
def dashboard():
return "欢迎来到控制面板"
总结
- Flask 装饰器是基于 Python 高阶函数实现的,用于扩展功能。
- 常见的 Flask 内置装饰器:
@app.route
:定义 URL 路由@app.before_request
:在请求前执行@app.after_request
:在请求后执行@app.errorhandler
:处理错误
- 可以自定义装饰器,用于认证、日志等功能。
- Flask 扩展提供的装饰器(如
@login_required
)增强了 Flask 的能力。😃