2

我想在我的蓝图中使用以下基本身份验证装饰器:

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模块,该模块也需要一个数据库实例,它需要应用程序实例,因为Database()模块使用应用程序进行配置:

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模块我可以导入并在其中使用它,view.py但是当我尝试将它导入我的一个蓝图时它失败了。我认为这是因为 auth 模块导入了 app 模块,而蓝图正在扩展 app 模块,所以我得到了循环导入。有任何想法吗?

4

1 回答 1

3

正如您所指出的,我认为问题出在您的模块组织上。如果您创建一个包含 的装饰器模块requires_auth怎么办?

然后,您将构建您的导入流程,如下所示:

  1. app.py(实例化应用程序和数据库)
  2. auth.py(实例化身份验证,从 app.py 导入)
  3. api.py(实例化 api,从 app.py 导入)
  4. decorators.py(定义 requires_auth,从 auth 和 api 导入)
  5. blueprints/views.py(从 app.py、auth.py、api.py、decorators.py 导入)
  6. main.py(导入 app、auth、api、decorators、blueprints)并且是应用程序的入口点。
于 2013-12-16T17:01:20.047 回答