调用路由方法时,在Flask对象之前使用'@'有啥需要[重复]

Posted

技术标签:

【中文标题】调用路由方法时,在Flask对象之前使用\'@\'有啥需要[重复]【英文标题】:What is the need of using '@' before Flask object, when calling route method [duplicate]调用路由方法时,在Flask对象之前使用'@'有什么需要[重复] 【发布时间】:2020-05-03 04:50:53 【问题描述】:

我是Flask 的新手。当我遇到基本的 Flask 示例(下面的代码)时,我陷入了不确定性:在变量 app.我尝试在删除@ 时运行应用程序,但我不能。如果这是我要问的一些非常基本的事情,请发表评论。

from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')

def hello():
   name = request.args.get("name", "World")
   return f'Hello, escape(name)!'

【问题讨论】:

这可以帮助你***.com/questions/6392739/… 【参考方案1】:

@ 符号用于装饰器。

decorator 是一个将另一个函数作为参数并修改其行为的函数。

对于 Flask,app.route 是一个装饰器,它将“安装”你的函数作为你的网络应用程序中特定路由的处理程序。

这样做:

@app.route('/foo')
def hello():
    return 'Hello'

和做的一样:

def f():
    return 'Hello'

decorator = app.route('/foo')
hello = decorator(f)

@ 符号的作用是将函数作为参数隐式调用app.route('/foo') 的结果。如您所见,这使上述代码更加方便和易于阅读。


如果您查看the Flask source code,您会看到route() 的定义是Flask 类的方法:

class Flask:
    #...
    def route(self, rule, **options):
        def decorator(f):
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f

        return decorator

【讨论】:

【参考方案2】:

那是decorator。简而言之,route 是一个装饰器,它告诉 Flask 哪个 URL 应该触发我们的函数。

【讨论】:

【参考方案3】:

Python 装饰器是用于转换其他函数的函数。当调用装饰函数时,会调用装饰器。然后装饰器可以采取行动、修改参数、停止执行或调用原始函数。我们可以使用装饰器在视图执行之前将我们希望运行的代码包装起来。

@decorator_function
def decorated():
    pass

如果您已经阅读过 Flask 教程,那么此代码块中的语法可能对您来说很熟悉。

@app.route 是一个装饰器,用于匹配 URL 以查看 Flask 应用中的函数。

更详细的描述,你甚至可以参考这个documentation 另外,在***上也有类似的问题,你也可以参考this。

【讨论】:

以上是关于调用路由方法时,在Flask对象之前使用'@'有啥需要[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java中类的构造方法和普通的方法在使用上有啥区别?

Flask学习第6天:app.add_url_rule调用路由

Flask-01

Flask视图:视图函数,类视图,蓝图使用方法整理

flask模板的使用

Flask之基于route装饰器的路由系统(源码阅读解析)