1

这几天我一直在尝试解决这个问题。我正在使用教程中描述的应用程序设置运行烧瓶。以下是安装在虚拟环境中的软件包。

pip3 freeze

click==7.1.2 Flask==1.1.2 itsdangerous==1.1.0 Jinja2==2.11.2 MarkupSafe==1.1.1 pkg-resources==0.0.0 python-dotenv==0.15.0 Werkzeug==1.0 .1

我在 .env 文件中有以下内容:

FLASK_APP=myapp

就这样我能做到flask run。我的目录结构如下:

目录结构

这都包含在一个名为“proj”的目录中

初始化.py

import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object('conf.DevConfig')
    app.config.from_mapping(DATABASE=os.path.join(app.instance_path, 'tester.sqlite'))

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

在项目中,我运行flask run并获得以下信息:

werkzeug.utils.ImportStringError: import_string() failed for 'conf.DevConfig'. Possible reasons are:

- missing __init__.py in a package;
- package or module path not included in sys.path;
- duplicated package or module name taking precedence in sys.path;
- missing module, class, function or variable;

Debugged import:

- 'conf' not found.

Original exception:

ModuleNotFoundError: No module named 'conf'

请注意,在 proj/instance/ 中有一个 conf.py

conf.py 包含

class Config(object):
   DATABASE = 'tester.sqlite'

class DevConfig(Config):
   DEBUG = True

class ProdConfig(Config):
   DEBUG = False

奇怪的是,如果我将 conf.py 放在 proj/ 中,那么应用程序就会正常加载。我可以发誓我读到 Flask 会默认搜索 proj/instance 文件。为什么当我将它从实例移回一级时它会找到它。就此而言,可以将 .env 文件存储在实例中,并且烧瓶会自动找到它们吗?对我来说,它似乎instance_relative_config=True没有做它应该做的事情。flask run如果调用在 proj/ vs proj/myapp 中运行,调用有什么影响

4

2 回答 2

1

您可以将其视为(不是 100% 确定),当您这样做时,flask run函数create_app会被调用并运行。

就像在运行它的导入函数之外添加一个run_app.py文件一样projappcreate_app

所以run_app.py

 from app import create_app
 app = create_app()
 if __name__=='__main__':
      app.run()

这将运行服务器(就像您现在所做的那样) export FLASK_ENV=appexport FLASK_ENV=run_app.py相同

现在,您已经添加了配置文件,并且当该文件位于文件夹中而不是文件夹conf.py中时,它对您来说工作正常。发生这种情况是因为在文件中您已将配置对象的位置定义为,因此 python 也在 proj 文件夹中寻找此对象。projinstanceapp/__init__.pyconf.DevConfig

因为你已经在instance/conf.py文件中定义了配置对象,所以 python 无法找到它并给你这个错误。

要解决此问题,您需要提供对象的位置app.config.from_object('conf.DevConfig')

所以你可以通过两种方式做到这一点,

第一个。提供来自 proj 文件夹的完整 conf 对象路径,例如

 app.config.from_object('instance.conf.DevConfig')

第二。导入app/__init__.py文件中的实例,然后提供配置对象

例如。 app/__init__.py

"""      

import other packages

"""
from instance import conf


def create_app(test_config=None):
    """
    app config thing here
    """
    app.config.from_object(conf.DevConfig)
    """
    config app more
    """
    return app

请注意,在方法一中,我将对象作为字符串提供,在 2 中作为类方法

于 2021-01-08T00:51:36.523 回答
0

app.config.from_object() 将从flask run执行位置搜索。在这种情况下,来自 /proj 目录

app.config.from_pyfile() 将至少在instance_relative_config设置为 true的情况下进行搜索

sahasrara62 所述:可以使用“instance.conf.DevConfig”在 conf.py 中找到 devConfig 类

我没有注意到任何flask run添加run_app.py文件并执行它的证据,但它似乎flask run从运行它的目录开始

于 2021-01-09T03:04:40.813 回答