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

时间:2014-06-10 06:13:12

标签: python flask openid flask-login

我在我的愚蠢练习应用中使用Flask-OpenID进行用户登录。

要做的第一件事是创建一个openid对象,稍后用它来装饰登录处理程序(和其他东西):

oid = flask.ext.openid.OpenID(app, '/path/to/store')

@oid.loginhandler
def login():
    ...

@oid.after_login
def after_login():
    ...

但是,我想在我的应用的__init__.py文件中初始化Flask-OpenID,但在其他文件中使用OpenId对象oid,例如我的应用{{1}文件和其他可能的。预期的方法是什么?烧瓶开发人员通常如何为应用程序创建views.py全局内容?

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

  • views.py放入oid并在其中初始化。在此选项中,如何在应用模块的其他部分中访问__init__.py

  • 为与Flask-OpenID和Flask-Login相关联的对象和方法创建一个oid文件。然后auth.py可以在应用中的任何位置使用。然后,我是否为每个扩展程序创建一个新文件,该文件不会直接耦合到其他地方? 这是否过度,或者是扩大规模并保持井井有条的正确模式?

  • 或者,为所有这些小扩展对象创建一个文件,可能称为auth.oidglobals.py。这看起来很尴尬和笨拙。 或者大多数烧瓶应用程序最终都有一个随机存储桶用于所有其他需要位于某处的垃圾?

1 个答案:

答案 0 :(得分:1)

这三个选项有各种权衡(如你所发现的):

  1. auth中创建__init__.py - 这会导致您的观看次数与您的基本应用之间的循环引用 - 它可以正常工作,但这会使因素变得更加困难(因为移动两个不相关的导入可能会导致在一个错误)。
  2. 创建一个单独的模块来处理单独的问题 - 这避免了循环引用问题,并增加了大型项目的清晰度("啊,这里是处理身份验证的代码属于#34;)。另一方面,具有几个小扩展的小项目可能会出现类似Java的模块爆炸。
  3. 创建一个单独的模块来初始化应用程序中使用的所有Flask扩展。这也避免了循环引用问题,并使小项目不必要地增加模块。然而,在较大的项目中,这样的模块变成了一个大球。 ("这是配置身份验证,平面文件处理和错误处理的地方")。
  4. 还有第4个选项 - 将auth添加到您的视图层,因为您验证的 特定于您的应用程序逻辑(例如,而不是您的域模型)。

    我建议完全避免#1(跳过"两个模块的额外费用"直接进入"三个或更多模块阶段"可忽略不计)。其余三个选项中哪一个适合您的项目,这对项目和开发人员来说非常具体。