烧瓶如何知道为特定的 Web 地址调用哪个函数



在populair web框架烧瓶中,一个基本的网页看起来像这样:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"

我对 python 很陌生,我想知道这到底是如何工作的。我知道@是一个装饰hello函数的装饰器,但是烧瓶如何必须调用底层hello功能,甚至知道它的存在,因为代码不会像这样运行hello函数:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
hello()

当我编码时,我喜欢在随机接受任何东西之前知道某件事是如何工作的。我搜索了一下,但找不到一个令人愉快的答案。我也查看了源代码,但我无法找到它是如何工作的

所以现在真正的问题是:我怎样才能在普通的 python 中重新创建一些类似的东西?因此,运行一个函数而不先在主代码中真正调用它。

对不起,我的英语不好,这不是我的主要语言。

app.route()会记住URL("/"(和与之关联的函数(hello(。稍后,app.run()可以查询该关联并调用hello

如何在普通的蟒蛇中重新创建类似的东西?

此程序可能会让您了解如何调用hello()

class Flask:
    def __init__(self):
        self.routes = {}
    def route(self, path):
        def wrapper(fn):
            self.routes[path] = fn
            return fn
        return wrapper
    def run(self):
        # Networking code goes here.
        # Suppose "/" comes in as a request, then this happens:
        self.routes["/"]()
app = Flask()

@app.route("/")
def hello():
    print("Inside hello")
    return "Hello World!"
app.run()

或者,您可以检查flask源: https://github.com/pallets/flask 具体来说,app.route()定义如下: https://github.com/pallets/flask/blob/0.12.2/flask/app.py#L1054 对hello()的调用如下: https://github.com/pallets/flask/blob/0.12.2/flask/app.py#L1052

最新更新