装饰器传参应用

路由注册

传统方式

若要实现一个简化版的 "Web 应用" 路由系统,主要用于展示如何手动注册路由与相应的视图函数,并且在控制台输出已注册的路由信息,这段代码如下:

# 存储路由的字典
url_map = {}

def add_route(rule, func):
    """手动注册路由的函数"""
    print(f"正在注册路由: {rule} -> {func.__name__}")
    url_map[rule] = func  # 注册路由

def run():
    """运行已注册的路由"""
    print("应用正在运行,已注册的路由如下:")
    for rule, func in url_map.items():
        print(f"注册路由: {rule} -> {func.__name__}")

def home():
    return "欢迎来到首页!"

def about():
    return "这是关于页面!"

# 手动添加路由
add_route('/', home)
add_route('/about', about)

if __name__ == '__main__':
    run()  # 运行自定义的 Flask 应用
装饰器传参应用

使用函数装饰器

装饰器通过语法糖简洁地注册路由,将路由注册与视图逻辑分离,使得代码结构更加清晰。保持代码的整洁性,避免重复的函数调用。

函数式 Flask 实现示例

在这个示例中,我们将实现一个简单的装饰器来注册路由,并使用全局字典来存储路由与视图函数的映射:

# 存储路由的字典
url_map = {}

def route(rule):
    """装饰器工厂,用于注册路由"""
    print(f"route 方法被调用,准备注册路由: {rule}")
    
    def decorator(func):
        """内部装饰器,用于将视图函数与路由关联"""
        print(f"正在注册路由: {rule} -> {func.__name__}")
        url_map[rule] = func  # 注册路由
        return func  # 返回原函数
    
    return decorator  # 返回内部装饰器

def run():
    """运行已注册的路由"""
    print("应用正在运行,已注册的路由如下:")
    for rule, func in url_map.items():
        print(f"注册路由: {rule} -> {func.__name__}")

# 使用装饰器注册路由
@route('/')  # 注册路由 '/'
def home():
    return "欢迎来到首页!"

@route('/about')  # 注册路由 '/about'
def about():
    return "这是关于页面!"

if __name__ == '__main__':
    run()  # 运行自定义的 Flask 应用

decorator 函数:

  • 包含实际的注册逻辑,将视图函数与给定的路由关联在一起,并输出相关信息。

面向对象:使用类实例属性管理路由

class MyFlask:
    def __init__(self):
        self.url_map = {}  # 存储路由的字典
        print("MyFlask 实例已创建,url_map 初始化为空字典。")

    def route(self, rule):  # 装饰器工厂
        print(f"route 方法被调用,准备注册路由: {rule}")
        
        def decorator(func):  # 内部装饰器
            print(f"正在注册路由: {rule} -> {func.__name__} (内存地址: {id(func)})")
            self.url_map[rule] = func  # 注册路由
            return func  # 返回原函数
        
        return decorator  # 返回内部装饰器

    def run(self):
        print("应用正在运行,已注册的路由如下:")
        for rule, func in self.url_map.items():
            print(f"注册路由: {rule} -> {func.__name__} (内存地址: {id(func)})")

# 创建 MyFlask 实例
app = MyFlask()

@app.route('/')  # 注册路由 '/'
def home():
    return "欢迎来到首页!"

@app.route('/about')  # 注册路由 '/about'
def about():
    return "这是关于页面!"

if __name__ == '__main__':
    app.run()  # 运行自定义的 Flask 应用

输出步骤说明

  1. 创建 MyFlask 实例
    • MyFlask 实例已创建,url_map 初始化为空字典。 这行输出表示 MyFlask 类的实例 app 被创建,并初始化了一个空的 url_map
  2. 调用 route 方法
    • 当你使用 @app.route('/') 装饰器时,它会调用 route 方法。
    • 输出 route 方法被调用,准备注册路由: / 表示这个方法被调用,并准备为路径 '/' 注册路由。
  3. 注册路由的过程
    • 在 decorator 内部,输出 正在注册路由: / -> home 显示了即将将 home 函数与 URL 路径 '/' 进行绑定。
  4. 重复处理 /about 路由
    • 同样的步骤会发生在注册 /about 路由时,先输出提示,然后注册。
  5. 应用运行
    • 最后,调用 app.run(),输出 应用正在运行,已注册的路由如下: 进入到 run 方法。
    • 遍历并展示所有已注册的路由,输出 注册路由: / -> home 和 注册路由: /about -> about

发布者:LJH,转发请注明出处:https://www.ljh.cool/43047.html

Like (0)
LJHLJH
Previous 2025年7月3日 下午3:40
Next 1天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注