Flask中使用的路由装饰器是如何工作的

2024-03-29 00:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我熟悉Python的装饰器的基础知识。然而,我不明白这个用于烧瓶路线的特定装饰器是如何工作的

以下是Flask网站上的代码片段:

from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

.route('/')是让我困惑的部分。我看到decorators的使用方式是decorator注释通常是一个函数,它接受一个参数,即decorator函数本身,然后可以在decorator内部执行。但这里似乎有所不同

多谢各位

更新:感谢您在我的第二段代码中提供关于self的提示。作为Python新手,我完全忘记了something的第一个参数必须是self。乍一看,我不认为这个例子有助于澄清这个问题,因此我把它删除了


Tags: 函数代码nameselfappflask参数烧瓶
2条回答

听起来你有一些误解,我们希望能澄清。首先,decorator只是一个术语(和一些语言“sugar”,即@decorator语法),表示接受一个可调用项并返回另一个可调用项的可调用项。这个可调用函数可以是一个函数(例如def foo(func)),也可以是一个方法(例如obj.method(func)),它只需要是一个接受可调用函数并返回可调用函数的东西

在Flask的@app.route装饰器中,您正在将hello函数传递给对象的(我认为是flask.Flask对象的^{route方法。反过来,当Flask应用程序被告知开始服务请求时,它会将您的函数及其相关配置添加到自己的“内存”中进行路由

其次,您的示例具有def something(arg1, arg2):调用时传递给对象方法的第一个参数是对象实例,通常称为self

这篇Primer on Python Decorators文章可能是一个很好的开始阅读他们如何/为什么以这种方式工作的地方

装饰器只是一个函数,它接受一个函数作为参数并返回另一个函数。接受参数的decorator(比如flask的routedecorator)必须返回一个可以用作简单decorator的函数

例如,我们可以这样编写route装饰器:

routes = {}


def route(path):
    def inner(func):
        global routes
        routes[path] = func
        return func

    return inner

调用route('/')返回一个以函数为参数的函数,该函数使用传递给外部函数的path值和内部函数接收的func值更新全局routes变量

如果我们在几个函数上使用它:

@route('/')
def func1():
    ...

@route('/example')
def func2():
    ...

然后我们可以检查routes变量,并看到它现在将路径映射到适当的函数。运行:

print(routes)

产生类似于:

{'/': <function func1 at 0x7f0c4aeac050>, '/example': <function func2 at 0x7f0c4aeb1e60>}

相关问题 更多 >