微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解装饰器并需要在包装器函数内部返回

如何解决了解装饰器并需要在包装器函数内部返回

这是来自 api.py 的代码

def route(self,path):
       if path in self.routes :
           raise AssertionError('Such route already exists')
       def wrapper(handler):
           self.routes[path] =handler
           print(colorama.Fore.GREEN,"handler check",handler)
           return handler
       return wrapper

这是来自 app.py 的代码

from api import API
app = API(templates_dir="templates")
from middleware import Middleware

@app.route("/home")
def home (request,response):
    response.text ='Hello from home function'
  
@app.route("/about")    
def about(request,response):
    response.text ='Hello from about function'    
    
@app.route("/hello/{name}")
def greeting(request,response,name):
    response.text = f"Hello,{name}"    

我很难理解路由装饰器的工作原理?我看到它接受一个参数“/about”和“/home”,但为什么我们需要在路由装饰器中返回对处理程序的引用。 一个清晰的解释应该真的很有帮助。

解决方法

所以 route 在一个看起来像这样的类中:

class API:
    routes = {}

    def route(self,path):
        if path in self.routes :
            raise AssertionError('Such route already exists')
        def wrapper(handler):
            self.routes[path] =handler
            print(colorama.Fore.GREEN,"handler check",handler)
            return handler
       return wrapper

   def handle(self,path,request):
       if path in self.routes:
           response = Response()
           self.routes[path](request,response)
           send_to_client(response)
       raise NotFound()

使用时

@app.route("/home")
def home(request,response):
    response.text ='Hello from home function'

这与执行以下操作相同:


def home_function(request,response):
    response.text ='Hello from home function'

home = app.route("/home")(home_function)

首先,我们使用参数 app.route 调用 "/home"。这样做的第一件事是检查我们是否已经有一个名为 /home 的路由。然后它返回新函数,即名为 wrapper 的函数。

现在我们使用我们想要处理 wrapper 路径的函数调用 /home。它所做的是向 dict 添加从路径 (/home) 到我们要调用以处理此路径的函数的映射。

同样的事情发生在所有装饰函数上。

现在,当我们想要处理传入的请求时,您可以想象一些类似于 handle 函数运行的情况。我们知道 routes 映射的每个键都将是一个路径,每个值都将是一个接受请求和响应的函数。那么我们只需要获得正确的函数,并适当地调用它。

有意义吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。