如何在烧瓶中的蓝图中使用身份验证装饰器

时间:2013-12-12 21:59:04

标签: python flask flask-peewee

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

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模块,所以我得到一个循环导入。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

然后,您将构建导入流程,如:

  1. app.py(实例化app& db)
  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),是应用程序的入口点。