如何理解Flask实例init中的第一个参数?

sto*_*ren 1 python flask

创建Flask实例时,我们总是将其__name__用作第一个参数,但是为什么呢?

class flask.Flask(import_name, static_path=None, static_url_path=None,static_folder='static', template_folder='templates', instance_path=None, instance_relative_config=False)
Run Code Online (Sandbox Code Playgroud)

官方文件说第一个参数用于查找资源,如何?

Sea*_*ira 5

导入名称用于解析Flask应用程序的安装目录(请参见flask / helpers.py中get_root_path功能)。这样,诸如,和相关文件路径之类的内容就可以解析为应用程序文件夹中的文件,而无需提供文件路径。render_templatesend_static_fileconfig

考虑一个没有此功能的极其简单的Python应用程序:

simple_app.py

print("Running simple_app")

with open('the-folder/simple.file', 'r') as f:
    for line in f:
        print(f)
Run Code Online (Sandbox Code Playgroud)

简单文件

Hello
World!
Run Code Online (Sandbox Code Playgroud)

目录结构如下所示:

some-path/
    simple-app/
        simple_app.py
        the-folder/
            simple.file
Run Code Online (Sandbox Code Playgroud)

如果我们在当前工作目录下启动Python,那么simple-app/一切都会正常进行:

simple-app$ python simple_app.py
Running simple_app
Hello
World!
Run Code Online (Sandbox Code Playgroud)

但是,如果我们向上移动一个文件夹,然后重试:

some-path$ python simple-app/simple_app.py
Traceback (most recent call last):
IOError: [Errno 2] No such file or directory: 'the-folder/simple.file'
Run Code Online (Sandbox Code Playgroud)

当我们向下移动一个文件夹时,也会发生同样的事情。但是,如果可以获取simple_app.py文件系统上的位置,则可以使用以下命令安装os.join目录simple_app.pythe-folder/simple.file

with open(os.join(SIMPLE_APP_DIR, 'the-folder/simple.file', 'r') as f:
Run Code Online (Sandbox Code Playgroud)

而且我们的工作目录无关紧要,因为我们将始终处理绝对路径。这就是Flask所做的,这就是为什么它需要__name__传入的原因。


小智 0

文档的快速入门部分对此进行了解释。

\n\n

http://flask.readthedocs.org/en/latest/quickstart/#a-minimal-application

\n\n

引用自文档

\n\n
\n

第一个参数是 application\xe2\x80\x99s 模块或包的名称。如果您使用单个模块(如本例所示),则应该使用__name__,因为根据它是作为应用程序启动还是作为模块导入,名称会有所不同(__main__与实际导入名称相对)。这是必要的,以便 Flask 知道在哪里寻找模板、静态文件等。

\n
\n