在 Flask 框架 @app.route('/') 中,route('/') 函数如何用作 app 对象的装饰器?

In Flask framework @app.route('/') , how route('/') function is used as a decorator from app object?

在Flask框架中,app是一个对象,route('/')是一个函数,用作装饰器。谁能告诉我这个装饰器背后的机制是什么? route('/') 方法是如何调用的?

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

变量app与文件app.py没有直接关系。你可以用不同的方式命名它们。

app.route('/') 是 returns 装饰器的函数调用,然后应用于 hello_world.

你可以写

@app.route('/')
def hello_world():
    return 'Hello, World!'

作为

root_decorator = app.route('/')

@root_decorator
def hello_world():
    return 'Hello, World!'

root_decorator = app.route('/')

def hello_world():
    return 'Hello, World!'

hello_world = root_decorator(hello_world)

这是对发生的事情的模拟:

class Flask:
    def route(self, path):
        def decorator(function):
            def new_function(*args, **kwargs):
                print(f'path is {path!r}. doing some Flask magic now.')
                return function(*args, **kwargs)
            return new_function
        return decorator

app = Flask()

@app.route('/')
def hello_world():
    return 'Hello, World!'

演示:

>>> result = hello_world()
path is '/'. doing some Flask magic now.
>>> result
'Hello, World!'