我在我愚蠢的练习应用程序中使用 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
,例如我的应用程序的 views .py
文件和可能的其他文件。这样做的预期方法是什么? Flask 开发人员通常如何将 oid
之类的东西设置为应用程序的全局变量?
在this similar question ,SQLAlchemy 对象被移动到 models
模块,但在应用程序设置期间在其他地方初始化,这是有道理的,因为 db
对象与模型耦合。 OpenID 对象遵循相同的模式。但是我不想把oid
放在views.py
中;它显然不属于那里。那么你会把它放在哪里?我可以想到解决方案,但我想知道 flask 开发人员通常做什么。以下是一些想法:
将
oid
放入__init__.py
并在那里对其进行初始化。在这个选项中,如何在应用模块的另一部分访问oid
?为与 Flask-OpenID 和 Flask-Login 关联的对象和方法创建一个
auth.py
文件。然后auth.oid
将在应用程序的任何地方工作。然后我是否为未直接耦合到其他地方的每个 扩展创建一个新文件? 这是矫枉过正,还是扩大规模和保持井井有条的正确模式?或者,为所有这些小扩展对象创建一个文件,可能称为
globals.py
或exts.py
。这看起来很尴尬和笨拙。 或者大多数 Flask 应用程序最终是否有一个随机桶来存放所有这些只需要位于某个地方的垃圾?
最佳答案
这三个选项有不同的权衡(如您所见):
- 在
__init__.py
中创建auth
- 这会导致你的 View 和你的基础应用程序之间的循环引用 - 它可以工作,但它使得它更难分解(因为移动两个不相关的导入会导致错误)。 - 创建一个单独的模块来处理单独的关注点——这避免了循环引用问题并增加了更大项目的清晰度(“啊,这是处理身份验证的代码所在的地方”)。另一方面,带有几个小扩展的小项目最终可能会出现类似 Java 的模块爆炸式增长。
- 创建一个单独的模块来初始化应用程序中使用的所有 Flask 扩展。这也避免了循环引用问题,并防止小项目不必要地增加模块。然而,在更大的项目中,这样的模块变成了一个大泥球。 (“这是配置身份验证、平面文件处理和错误处理的地方”)。
还有第 4 个选项 - 添加 auth
到您的 View 层,因为如何您的身份验证是特定于您的应用程序逻辑的(而不是您的域模型,因为示例)。
我建议完全避免#1(跳过“两个模块”阶段直接进入“三个或更多模块阶段”的额外成本可以忽略不计)。其余三个选项中的哪一个适合您的项目取决于项目和从事该项目的开发人员。
关于python - 如何使 Flask-OpenID 对象成为应用程序的全局对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24134085/