Как использовать декоратор аутентификации из плана в колбе

Я хотел бы использовать в своих чертежах следующий базовый декоратор аутентификации:

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, но когда я пытаюсь импортировать его в один из моих чертежей, мне не удается. Я думаю, это потому, что модуль аутентификации импортирует модуль приложения, а проект расширяет модуль приложения, поэтому я получаю циклический импорт. Любые идеи?


person Chris Matta    schedule 12.12.2013    source источник


Ответы (1)


Как вы заметили, я думаю, что проблема в организации вашего модуля. Что, если вы создадите модуль декораторов, содержащий requires_auth?

Затем вы структурируете свой импорт следующим образом:

  1. app.py (создание экземпляра приложения и базы данных)
  2. auth.py (экземпляр аутентификации, импорт из app.py)
  3. api.py (создание экземпляра API, импорт из app.py)
  4. decorators.py (определение require_auth, импорт из auth и API)
  5. blueprints/views.py (импорт из app.py, auth.py, api.py, decorators.py)
  6. main.py (импортирует приложение, аутентификацию, API, декораторы, чертежи) и является точкой входа для приложения.
person coleifer    schedule 16.12.2013
comment
Дело в том, что я прописывал чертежи в модуле app.py, а не в main.py. Сейчас я регистрирую чертежи в модуле main.py и избегаю кругового импорта. Это также позволяет мне определить функцию requires_auth в модуле аутентификации, что имеет смысл. Большое спасибо. - person Chris Matta; 16.12.2013