我在我的愚蠢练习应用中使用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.oid
或globals.py
。这看起来很尴尬和笨拙。 或者大多数烧瓶应用程序最终都有一个随机存储桶用于所有其他需要位于某处的垃圾?
答案 0 :(得分:1)
这三个选项有各种权衡(如你所发现的):
auth
中创建__init__.py
- 这会导致您的观看次数与您的基本应用之间的循环引用 - 它可以正常工作,但这会使因素变得更加困难(因为移动两个不相关的导入可能会导致在一个错误)。还有第4个选项 - 将auth
添加到您的视图层,因为您验证的 特定于您的应用程序逻辑(例如,而不是您的域模型)。
我建议完全避免#1(跳过"两个模块的额外费用"直接进入"三个或更多模块阶段"可忽略不计)。其余三个选项中哪一个适合您的项目,这对项目和开发人员来说非常具体。