我的情况是,我想使用 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/