Я хотел бы использовать в своих чертежах следующий базовый декоратор аутентификации:
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
в мои отдельные определения Blueprint? Как мне это сделать, если мне нужен доступ к объекту app
для создания объекта db
?
Изменить: я реорганизовал свое приложение, чтобы оно выглядело следующим образом: http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-the-coming-from-django/ я поместил функцию requires_auth
в свой auth.py
, я могу импортировать и использовать его в view.py
, но когда я пытаюсь импортировать его в один из моих чертежей, мне не удается. Я думаю, это потому, что модуль аутентификации импортирует модуль приложения, а проект расширяет модуль приложения, поэтому я получаю циклический импорт. Любые идеи?