【Python】装饰器在实际项目的一些应用

当谈论装饰器的实际应用时,下面是一些简单的示例代码,演示了不同类型的装饰器在项目中的用途。这些示例代码是基于 Python 的。

  1. 认证和授权装饰器:
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
  1. 日志记录装饰器:
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
  1. 缓存装饰器:
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
  1. 错误处理装饰器:
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
  1. 参数验证装饰器:
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
  1. 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函数
  1. 事务管理装饰器(使用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)
    # 这里可以进行其他数据库操作
  1. 缓存控制装饰器(使用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"

猜你喜欢

转载自blog.csdn.net/linjiuxiansheng/article/details/133895780