Python 从另一个全局对象构造一个可变全局对象

Posted

技术标签:

【中文标题】Python 从另一个全局对象构造一个可变全局对象【英文标题】:Python construct a mutable global object from another global object 【发布时间】:2021-07-31 17:01:37 【问题描述】:

我有main.pyapp.pyapp.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 从另一个全局对象构造一个可变全局对象的主要内容,如果未能解决你的问题,请参考以下文章

Python3 函数基础2

C++ - 全局静态对象和局部静态对象的构造函数调用不同?

首先调用的是 DllMain() 还是全局静态对象构造函数?

Javascript中call,apply,bind方法的详解与总结

qt全局对象删除

C++11是不是指定了静态/全局变量的构造顺序?