Python 装饰器是如何绑定到Flask应用程序实例的?
我的情况是,我想用Apache2运行一个Flask应用程序,目前,如果我按照任何Flask教程所说的那样做,一切都正常。我的问题是,我不理解decorators,即路由器,是如何与Flask应用程序联系在一起的,教程和Flask自己的文档在这方面都没有任何用处。我已经尽了最大的努力寻找关于装饰器(即路由器)如何与Flask应用程序实例绑定的信息,但我什么也没想到。目前,一切都“正常运转”,这一切对我来说就像是巫术 也就是说,我最初的申请是这样的:Python 装饰器是如何绑定到Flask应用程序实例的?,python,flask,Python,Flask,我的情况是,我想用Apache2运行一个Flask应用程序,目前,如果我按照任何Flask教程所说的那样做,一切都正常。我的问题是,我不理解decorators,即路由器,是如何与Flask应用程序联系在一起的,教程和Flask自己的文档在这方面都没有任何用处。我已经尽了最大的努力寻找关于装饰器(即路由器)如何与Flask应用程序实例绑定的信息,但我什么也没想到。目前,一切都“正常运转”,这一切对我来说就像是巫术 也就是说,我最初的申请是这样的: myproject/ app/
myproject/
app/
__init__.py
routes.py
myproject.wsgi
其中\uuuu init\uuuu.py
包含以下内容:
from flask import Flask
app = Flask(__name__)
from app import routes
from app import app
@app.route('/')
@app.route('/index')
def index():
return 'Hello, World!'
import sys
sys.path.insert(0, '/var/www/test')
from app import app as application
routes.py
包含以下内容:
from flask import Flask
app = Flask(__name__)
from app import routes
from app import app
@app.route('/')
@app.route('/index')
def index():
return 'Hello, World!'
import sys
sys.path.insert(0, '/var/www/test')
from app import app as application
和myproject.wsgi
具有以下内容:
from flask import Flask
app = Flask(__name__)
from app import routes
from app import app
@app.route('/')
@app.route('/index')
def index():
return 'Hello, World!'
import sys
sys.path.insert(0, '/var/www/test')
from app import app as application
现在,我的应用程序有了一些发展,我想为它实现正常工作的单元测试。我的tests
文件夹与myproject
位于同一根目录中
我不清楚的是,当我从myproject
导入app
进行测试时,它是否自动从routes.py
中的decorators分配了功能?如果是,为什么以及如何工作?如果没有,如何测试分配给具有装饰器的应用程序的函数?后者可能仅在我需要测试POST
请求时才重要
另外,有人能告诉我为什么几乎在每个教程中,应用程序,即应用程序
都构建在项目的\uuuu init\uuuuuuuuy.py
文件中?例如在app.py
文件或类似文件中初始化它不是更容易吗
我已经尽了最大的努力寻找关于装饰器(即路由器)如何与Flask应用程序实例绑定的信息,但我什么也没想到。目前,烧瓶中的一切“只是工作”似乎都像是巫术,就像每一个单曲一样让我们看看(减去它的文档字符串):
请注意,装饰器根本不修改装饰的函数;它按原样返回
f
。但是,它首先修改app
本身(通过self
参数),将给定的URL路径映射到函数;这意味着现在有多个对索引
函数的引用:索引本身,加上应用程序`内部持有的两个引用。这是如何实现的:
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
decorator只将函数func
添加到self.routes
字典中,并返回相同的函数。所以这只是一种更奇特的方式:
def index():
return "hello"
app.routes['/'] = index
及
只是一个语法糖:
def index():
return "hello"
index = app.route('/')(index)
关于\uuuu init\uuuu.py
+教程,在中对此进行了相关讨论。这里的建议似乎鼓励不要使用繁重的\uuuuu init\uuuuu.py
文件。感谢您提供有关装饰器的说明。但我仍然想问,我应该如何将装饰器函数绑定到Flask应用程序实例?例如,Flask类的内容与中的内容不一样,例如,app=Flask.Flask(\uuu name\uuuu)
?我的意思是,如果我在routes.py
中创建一个应用程序工厂函数,并通过工厂创建Flask应用程序的实例,那么一切都可以正常工作。然而,如果我想测试我在routes.py中分配给应用程序的功能,事情就会变得混乱,因为我不确定如何导入特定的flask实例,以及与之相关的所有方法。如何导入特定的flask实例
是否有许多flask
实例?或者你在问如何在多个python文件中共享同一个对象?第二个问题,如何共享同一个对象。我目前的解决方案是,我将routes.py
下的所有内容转移到应用程序创建方法中,在该方法中,我将函数与装饰器绑定。这样我就可以创建一个新的实例来创建我想要的方法。如果你知道更好的方法,请告诉我!