Python 如何使Flask OpenID对象成为应用程序的全局对象?

Python 如何使Flask OpenID对象成为应用程序的全局对象?,python,flask,openid,flask-login,Python,Flask,Openid,Flask Login,我在我愚蠢的实践应用程序中使用Flask OpenID进行用户登录 要做的第一件事是创建一个openid对象,该对象稍后用于修饰登录处理程序(以及其他内容): 但是,我想在我的应用程序的\uuu init\uuu.py文件中初始化Flask OpenID,但在其他文件中使用OpenID对象oid,比如我的应用程序的views.py文件和其他可能的文件。预期的方法是什么?flask开发者通常是如何将oid之类的东西放到应用程序的全局中的 在中,SQLAlchemy对象被移动到models模块,但在

我在我愚蠢的实践应用程序中使用Flask OpenID进行用户登录

要做的第一件事是创建一个openid对象,该对象稍后用于修饰登录处理程序(以及其他内容):

但是,我想在我的应用程序的
\uuu init\uuu.py
文件中初始化Flask OpenID,但在其他文件中使用OpenID对象
oid
,比如我的应用程序的
views.py
文件和其他可能的文件。预期的方法是什么?flask开发者通常是如何将
oid
之类的东西放到应用程序的全局中的

在中,SQLAlchemy对象被移动到
models
模块,但在应用程序设置期间在其他地方初始化,这是有意义的,因为
db
对象与模型耦合。OpenID对象遵循相同的模式。但是我不想把
oid
放在
views.py
中;它显然不属于那里。那么你会把它放在哪里呢?我可以想出解决方案,但我想知道flask开发人员通常做什么。以下是一些想法:

  • oid
    放入
    中,并在那里初始化它。在此选项中,如何访问应用程序模块另一部分中的
    oid

  • 为与Flask OpenID和Flask Login关联的对象和方法创建一个
    auth.py
    文件。然后,
    auth.oid
    将在应用程序中的任何位置工作。然后,我是否为每个没有直接耦合到其他地方的扩展名创建一个新文件这是一种过激行为,还是一种扩大规模、保持组织有序的正确模式?

  • 或者,为所有这些小扩展对象创建一个文件,可能称为
    globals.py
    exts.py
    。这看起来既尴尬又笨拙或者大多数flask应用程序最终都会有一个随机的存储桶来存储所有这些只需要放在某个地方的垃圾吗?


这三个选项有不同的权衡(如您所发现的):

  • \uuuu init\uuuuuuupy
    中创建
    auth
    -这会导致视图和基础应用程序之间的循环引用-它可以工作,但更难考虑(因为移动两个不相关的导入可能会导致错误)
  • 创建一个单独的模块来处理单独的问题-这避免了循环引用问题,并为更大的项目增加了清晰度(“啊,这里是处理身份验证的代码所在”)。另一方面,具有多个小扩展的小项目可能会以类似Java的模块爆炸结束
  • 创建一个单独的模块来初始化应用程序中使用的所有烧瓶扩展。这也避免了循环引用问题,并防止小项目不必要地增加模块。然而,在更大的项目中,这样的模块会变成一个大泥球。(“这是配置身份验证、平面文件处理和错误处理的地方”)
  • 还有第四个选项-向视图层添加
    auth
    ,因为您的身份验证方式取决于您的应用程序逻辑(例如,而不是您的域模型)


    我建议完全避免#1(跳过“两个模块”阶段直接进入“三个或更多模块阶段”的额外成本可以忽略不计)。剩下的三个选项中哪一个适合您的项目实际上是特定于项目和开发人员的。

    副本使用Flask SQLAlchemy,而不是Flask OpenID,但模式是相同的。如果它不能回答您的问题,请告诉我!:-)@答案似乎是将Alchemy对象放在另一个模块中,幸运的是,它所属的模块已经存在。在我的例子中,没有这样的模块已经存在。我已经扩大了我的问题,以明确哪些问题仍然没有答案。
    oid = flask.ext.openid.OpenID(app, '/path/to/store')
    
    @oid.loginhandler
    def login():
        ...
    
    @oid.after_login
    def after_login():
        ...