我想在我的蓝图中使用以下基本身份验证装饰器:
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
模块中,我可以在 view.py
中导入和使用它,但是当我尝试导入时它进入我的蓝图之一它失败了。我认为这是因为 auth 模块导入了 app 模块,而蓝图正在扩展 app 模块,所以我得到了一个循环导入。有什么想法吗?
正如您所指出的,我认为问题出在您的模块组织上。如果您创建一个包含 requires_auth
的装饰器模块会怎么样?
然后您将构建您的导入流程:
- app.py(实例化应用程序和数据库)
- auth.py(实例化 auth,从 app.py 导入)
- api.py(实例化 api,从 app.py 导入)
- decorators.py(定义 requires_auth,从 auth 和 api 导入)
- blueprints/views.py(从 app.py、auth.py、api.py、decorators.py 导入)
- main.py(导入应用程序、身份验证、api、装饰器、蓝图)并且是应用程序的入口点。
我是一名优秀的程序员,十分优秀!