这是来自 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”,但为什么我们需要在路由装饰器中返回对处理程序的引用。 一个清晰的解释应该真的很有帮助。
答案 0 :(得分:0)
所以 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
映射的每个键都将是一个路径,每个值都将是一个接受请求和响应的函数。那么我们只需要获得正确的函数,并适当地调用它。
有意义吗?