当谈论装饰器的实际应用时,下面是一些简单的示例代码,演示了不同类型的装饰器在项目中的用途。这些示例代码是基于 Python 的。
- 认证和授权装饰器:
from functools import wraps
def login_required(func):
@wraps(func)
def wrapper(request, *args, **kwargs):
if user_is_authenticated(request):
return func(request, *args, **kwargs)
else:
return "Access Denied"
return wrapper
@app.route('/secure-page')
@login_required
def secure_page(request):
return "Welcome to the secure page"
def user_is_authenticated(request):
# 在实际项目中,检查用户是否已登录
return request.user.is_authenticated
- 日志记录装饰器:
from functools import wraps
import logging
def log_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time()
result = func(*args, **kwargs)
end_time = time()
execution_time = end_time - start_time
logging.info(f"{
func.__name__} executed in {
execution_time} seconds")
return result
return wrapper
@log_time
def some_operation():
# 执行某些操作
pass
- 缓存装饰器:
from functools import wraps
def cache_result(func):
cache = {
}
@wraps(func)
def wrapper(*args, **kwargs):
if args in cache:
return cache[args]
result = func(*args, **kwargs)
cache[args] = result
return result
return wrapper
@cache_result
def expensive_operation(x, y):
# 执行昂贵的计算
return x + y
- 错误处理装饰器:
from functools import wraps
def handle_exceptions(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception as e:
logging.error(f"An error occurred in {
func.__name__}: {
str(e)}")
result = None # 或者可以选择重新引发异常
return result
return wrapper
@handle_exceptions
def risky_operation():
# 可能引发异常的操作
pass
- 参数验证装饰器:
from functools import wraps
def validate_input(func):
@wraps(func)
def wrapper(*args, **kwargs):
for arg in args:
if not isinstance(arg, int):
raise ValueError("Arguments must be integers")
return func(*args, **kwargs)
@validate_input
def add_numbers(x, y):
return x + y
- API路由装饰器(使用Flask框架示例):
from flask import Flask
app = Flask(__name)
def route(path):
def decorator(func):
@app.route(path)
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
return decorator
@route('/api/resource')
def api_resource():
return "This is an API resource"
# 在这种方式下,'/api/resource'路由被绑定到api_resource函数
- 事务管理装饰器(使用SQLAlchemy示例):
from functools import wraps
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("sqlite:///:memory:")
Session = sessionmaker(bind=engine)
def transactional(func):
@wraps(func)
def wrapper(*args, **kwargs):
session = Session()
try:
result = func(session, *args, **kwargs)
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
session.close()
return result
return wrapper
@transactional
def save_data(session, data):
session.add(data)
# 这里可以进行其他数据库操作
- 缓存控制装饰器(使用Flask示例):
from flask import Flask, make_response
app = Flask(__name)
def cache_control(max_age=60):
def decorator(func):
@app.route('/cache-control')
@wraps(func)
def wrapper(*args, **kwargs):
response = make_response(func(*args, **kwargs))
response.headers['Cache-Control'] = f'public, max-age={
max_age}'
return response
return wrapper
return decorator
@cache_control(max_age=3600)
def cached_page():
return "This page is cached for 1 hour"