Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 装饰器是如何绑定到Flask应用程序实例的?_Python_Flask - Fatal编程技术网

Python 装饰器是如何绑定到Flask应用程序实例的?

Python 装饰器是如何绑定到Flask应用程序实例的?,python,flask,Python,Flask,我的情况是,我想用Apache2运行一个Flask应用程序,目前,如果我按照任何Flask教程所说的那样做,一切都正常。我的问题是,我不理解decorators,即路由器,是如何与Flask应用程序联系在一起的,教程和Flask自己的文档在这方面都没有任何用处。我已经尽了最大的努力寻找关于装饰器(即路由器)如何与Flask应用程序实例绑定的信息,但我什么也没想到。目前,一切都“正常运转”,这一切对我来说就像是巫术 也就是说,我最初的申请是这样的: myproject/ app/

我的情况是,我想用Apache2运行一个Flask应用程序,目前,如果我按照任何Flask教程所说的那样做,一切都正常。我的问题是,我不理解decorators,即路由器,是如何与Flask应用程序联系在一起的,教程和Flask自己的文档在这方面都没有任何用处。我已经尽了最大的努力寻找关于装饰器(即路由器)如何与Flask应用程序实例绑定的信息,但我什么也没想到。目前,一切都“正常运转”,这一切对我来说就像是巫术

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

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
下的所有内容转移到应用程序创建方法中,在该方法中,我将函数与装饰器绑定。这样我就可以创建一个新的实例来创建我想要的方法。如果你知道更好的方法,请告诉我!