Python 从另一个全局对象构造一个可变全局对象
Posted
技术标签:
【中文标题】Python 从另一个全局对象构造一个可变全局对象【英文标题】:Python construct a mutable global object from another global object 【发布时间】:2021-07-31 17:01:37 【问题描述】:我有main.py
和app.py
。 app.py
包含 create_app()
,它返回 app
对象。 main.py
致电 create_app()
。我必须在main.py
中构造一个可变的全局对象。此全局对象将app
作为输入参数。这在 python 中对我来说似乎很复杂。应用程序启动时如何实现这种全局对象构造?
具体来说,我正在使用flask_oidc
,需要在main.py
中构造一个oidc = OpenIDConnect(app)
,并使oidc
对象在其他控制器.py 文件中可用。这个oidc
对象将存储用户信息并验证用户是否已通过身份验证。
感谢任何建议和见解。
【问题讨论】:
您可以创建一个具有oidc
属性的单例类,并在整个应用程序中使用它
或者您可以在模块中简单地创建一个全局对象oidc
,然后将该变量导入您想要的文件中
第二个选项如何工作,因为它需要 python app
作为输入参数?
【参考方案1】:
您可以创建一个模块,在应用程序启动时初始化您的 oidc
对象
helper.py
oidc = None # global instance
def init_oidc(app):
# initalise the oidc here and assign to the global variable
global oidc
oidc = OpenIDConnect(app)
return oidc
main.py
import init_oidc from helper
app = create_app()
# init only once at the start of the application
oidc = init_oidc(app)
在其他控制器文件中
sample_controller.py
import oidc from helper
# use the same oidc here
另一种选择是创建一个带有属性 oidc 的单例类,如果您需要其他方法以及 oidc,这将很有帮助
【讨论】:
oidc = OpenIDConnect(app)
-> oidc = OpenIDConnect(*args)
?
我试过这个,但不幸的是当应用程序运行时日志显示'NoneType' object has no attribute 'user_getinfo'
。不确定对象是否构造正确。我用from src.common.Authentication import oidc
在另一个文件中访问oidc
您确定对构造oidc
对象的函数的调用在任何使用之前都没有使用吗?另外,请确保两者都使用相同的进程,即构造对象的进程和使用它的进程
我只从应用程序的入口点 main.py 调用init_oidc
。在消费者.py中,我直接导入全局oidc
对象。
你能在问题中分享代码吗?以上是关于Python 从另一个全局对象构造一个可变全局对象的主要内容,如果未能解决你的问题,请参考以下文章
首先调用的是 DllMain() 还是全局静态对象构造函数?