繁体   English   中英

Flask 实例化 app = Flask()

[英]Flask instanciation app = Flask()

我在app故意删除名称=瓶(名称),我得到这个错误:

Traceback (most recent call last):
    File "routes.py", line 4, in <module>
        app = Flask() 
TypeError: __init__() takes at least 2 arguments (1 given)

这是我来自nettuts 的代码,这是我的代码:

from flask import Flask, render_template

app = Flask() 

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/about')
def about():
    return render_template('about.html')


if __name__ == '__main__':
    app.run(debug=True)

我的问题是:这个至少需要 2 个参数的init方法在哪里?

如果您了解类和对象的概念,那么__init__是初始化类实例的构造函数。 在这种情况下,类是 Flask,当您执行以下操作时,您正在初始化 Flask 对象的实例:

app = Flask(__name__) 

现在你的问题是,“这个至少需要 2 个参数的 init 方法在哪里?”

这可以根据以下定义代码中的构造函数的定义进行解释。

def __init__(self, import_name, static_path=None, static_url_path=None,
                 static_folder='static', template_folder='templates',
                 instance_path=None, instance_relative_config=False):

如果你看到上面, selfimport name是必需的参数,rest 都是默认的或不需要的。 Python 需要self ,即使您可以将其命名为任何其他名称。 阅读 python 的创建者自己的博客,了解为什么http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

__init__类似于 python 中的构造函数——它是在创建对象的新实例时被调用的函数,在这种情况下是Flask应用程序对象。

App 对象需要一个import_name ,这是您传递给Flask构造函数的第一个参数。 您可以在此处阅读更多相关信息(请参阅“关于第一个参数”)

我的问题是:这个至少需要 2 个参数的 init 方法在哪里?

就在这里:

https://github.com/pallets/flask/blob/master/src/flask/app.py#L401

您需要为 Flask 应用程序命名:

app = Flask(__name__)

__name__将是当前模块的名称,但原则上您可以随意称呼它...

直接回答您的问题: __init__是调用Flask() 您最初的调用旨在启动Flask类的实例,而__init__是进行设置的函数。

不过,要解决您的直接问题:您只需要传递一个参数。 错误消息具有误导性。

这不是错误的,但它谈论的是一个不是你认为你调用的函数。 @codegeek 的示例向您展示了“第一个”参数是什么。 self 但是当class.__init__作为调用Flask()结果而被调用时,它是从 Class 内部传递的。 您没有看到self被使用,除了隐式 - 当您认为传递参数时,它是回溯中的(给定的)参数。

重要的是,这并不是这种情况独有的——您会在非常简单的示例中看到同样的事情,例如:

class Example:
    def __init__(self, one):
        self.one = one
ex = Example()

这将产生:

TypeError: __init__() takes exactly 2 arguments (1 given)

意思是, Example()调用__init__ ,它需要 'self' 和 'one',而它只得到了 'self'。

(不过,从这个问题来看,我强烈建议您阅读类似http://pythoncentral.io/introduction-to-python-classes/或另一个 Python 类介绍的内容。类是该语言的基本元素,初始化它们是其功能的基本部分。)

为了简单回答您的问题, __init__方法是此处 Flask() 类的默认构造函数。 它只是驻留在您刚刚从语句中导入的 Flask 类中

from flask import Flask

所以,你说的那一刻

app = Flask(__name__)

它所做的只是实例化这个 Flask 类的一个对象。 而且由于您没有传递__name__参数,因此它会引发错误。

你可以在这里找到__init__方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM