Python 3.8 导入函数中的模块复制和应用程序对象范围

Python 3.8 module duplication and app object scope within imported functions

我对自定义模块的导入感到困惑。正如您在下面的代码中看到的那样,在 main 中,我首先导入了一切所需的所有库,并将这些导入复制到我的 i_setup_functions.py 文件中。将它们中的任何一个留在任何一个文件中都会产生错误。与重复“app = Flask(name)”相同。我真的希望冗余是不正确的,并且有一些简单的方法可以解决这个问题。我想要做的就是包括会话、电子邮件、数据连接等的设置。为了简单起见,这里只显示会话。

顺便说一句:在我尝试模块化之前,整个应用程序都没有错误。

错误信息:

RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.

该错误消息指向试图创建会话的 main.py 中间函数中的一行。

感谢大家分享任何想法!

main.py:

from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)
# is the following line even necessary in either module?
application = app

setup_sessions()
setup_mail()
setup_logging()
[snip]
# Error here:
​session["id_user"] = id_user

i_setup_functions.py

from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)
application = app

def setup_sessions():
    random.seed(datetime.now())
    app.config['SECRET_KEY'] = str(random.randint(1, 500)) + "jibber" + str(random.randint(1, 500)) + "jabber"
    app.permanent_session_lifetime = timedelta(days=30)
    return True

您正在创建两个(或更多?)单独的应用程序并将 SECRET_KEY 设置为不为您的应用程序提供服务的应用程序。

要解决此问题,请从除 main.py 之外的所有模块中删除所有 app = Flask(__name__) 调用。然后,将你在main.py中创建的app传递到所有你需要它的地方。

from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)

setup_sessions(app)
setup_mail(app)
setup_logging(app)

[snip]

​session["id_user"] = id_user