python - 装饰器如何与 Flask 应用程序实例绑定(bind)?

标签 python flask

我的情况是,我想使用 Apache2 运行 Flask 应用程序,目前如果我按照任何 Flask 教程所说的那样操作,一切都会正常。我的问题是,我不明白装饰器(即路由器)如何与 Flask 应用程序绑定(bind)在一起,并且所有教程和 Flask 自己的文档在这方面都没有任何用处。我已尽力查找有关装饰器(即路由器)如何与 Flask 应用程序实例绑定(bind)的信息,但我一无所获。目前,一切都“正常运转”,这对我来说就像是巫术。

也就是说,我最初的申请是这样的:

myproject/
    app/
      __init__.py
      routes.py
    myproject.wsgi

其中__init__.py具有以下内容:

from flask import Flask
app = Flask(__name__)
from app import routes

routes.py 具有以下内容:

from app import app
@app.route('/')
@app.route('/index')
def index():
    return 'Hello, World!'

myproject.wsgi具有以下内容:

import sys
sys.path.insert(0, '/var/www/test')
from app import app as application

现在,我的应用程序已经增长了一些,我想为其实现正常工作的单元测试。我的 tests 文件夹与 myproject 位于同一根目录中。

我不清楚的是,当我从 myproject 导入 app 进行测试时,它是否会自动具有从 中的装饰器分配给它的功能>routes.py?如果是这样,为什么以及如何运作?如果没有,如何使用装饰器测试分配给应用程序的函数?后者可能仅在我需要测试 POST 请求时才重要。

另外,有人可以告诉我为什么几乎在每个 Flask 教程中应用程序(即 app)都是在项目的 __init__.py 文件中构建的吗?例如在 app.py 文件或类似文件中初始化它不是更容易吗?

我已尽力查找有关装饰器(即路由器)如何与 Flask 应用程序实例绑定(bind)的信息,但我一无所获。目前 Flask 中的一切“正常运行”似乎就像巫术一样

最佳答案

这是如何实现的:

class Flask:
    def __init__(self):
        self.routes = {}

    def route(self, uri):
        def wrapper(func):
            self.routes[uri] = func
            return func
        return wrapper

app = Flask()

@app.route("/")
def index():
    return "hello"

route 装饰器仅将函数 func 添加到 self.routes 字典中并返回相同的函数。所以这只是一种更奇特的方法:

def index():
    return "hello"

app.routes['/'] = index

还有

@app.route('/')
def index():
    return "hello"

只是一个语法糖:

def index():
    return "hello"

index = app.route('/')(index)

关于python - 装饰器如何与 Flask 应用程序实例绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59336237/

相关文章:

javascript - 抓取网页没有进行 ajax 调用但数据不在 DOM 中

mysql - PyORMish 失去与 Flask 的 MySQL 连接

python - 从没有弹性 ip 的 EC2 向 AWS SES 发送电子邮件

Python 的 virtualenv 和目录

python形式itertools的乘积函数的Java替代

java - 泛型函数的典型操作

python - 在 doctests 中修改全局变量

python - 为 LabVIEW 在 Python 中返回图像的问题

python - Flask 设置代码运行一次,但不在测试期间运行

html - Flask send_file 作为附件不起作用