我想在我的蓝图中使用以下基本身份验证装饰器:
def requires_auth(func):
@wraps(func)
def decorated(*args, **kwargs):
request_auth = request.authorization
if not request_auth or not auth.authenticate(request_auth.username, request_auth.password):
return api.response_auth_failed()
return func(*args, **kwargs)
return decorated
在蓝图中:
@bp.route("/")
@requires_auth
def root():
return "root"
但它依赖于flask_peewee.auth
模块,它还需要一个db实例,这需要app实例,因为Database()
模块使用app进行配置:
db = Database(app)
auth = Auth(app, db)
通过在一个app.py
文件中实例化所有这些内容,我在应用程序更简单之前就已经开始工作了,但现在我想把它组织得更好。
是否可以将我的db.Model
定义和上面的requires_auth
装饰器移动到另一个文件,比如一个db_models.py
模块,并将requires_auth
装饰器导入我的个人蓝图定义?如果我需要访问app
对象来创建db
对象,我该怎么做?
编辑:我已经重新组织了我的应用程序,如下所示:http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/我将requires_auth
函数放入我的auth.py
模块,我可以导入并在{{1但是当我尝试将其导入我的蓝图时,它就失败了。我认为这是因为auth模块导入app模块,而蓝图正在扩展app模块,所以我得到一个循环导入。有什么想法吗?
答案 0 :(得分:2)
正如您所指出的,我认为问题在于您的模块组织。如果您创建包含requires_auth
的装饰器模块怎么办?
然后,您将构建导入流程,如: