Python / Flask — использование flask_restless с flask_httpauth

моя цель в этом вопросе - защитить мой API.

в моем приложении я использую Flask и flask_restless APIManager для предоставления CRUD API моему объекту Person.

пример кода:

manager = APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET', 'POST', 'PATCH', 'DELETE'])

а также используя flask_httpauth для защиты других моих маршрутов, например:

@app.route('/auth/get-token')
@auth.login_required
def get_auth_token():
    token = g.user.generate_auth_token()
    return jsonify({'token': token.decode('ascii'), 'fullname': g.user.fullname})

Я не мог понять, как использовать @auth.login_required с apimanager, чтобы он не отвечал на анонимные запросы, я читал в документации что-то о препроцессорах, но также не смог найти способ использовать его с декоратором @auth.login_required.

любая помощь будет оценена.


person Motassem MK    schedule 01.03.2017    source источник


Ответы (2)


К сожалению, похоже, что Flask-Restless в настоящее время официально не поддерживает прикрепление декораторов представлений к маршрутам, которыми он управляет. Существует открытая проблема по добавлению этой функции, а также другая проблема, в которой конкретно запрашивается поддержка Flask-HTTPAuth.

Существует еще третья проблема, в которой пользователь демонстрирует технику ручного внедрить декораторы после того, как Flask-Restless создал свои конечные точки. Фрагмент из примера этого пользователя, который добавляет декоратор get_cache, приведен ниже:

manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Person2, methods=['GET', 'POST', 'DELETE'])

# hackish view decoration:
for model in [Person, Person2]:
    model_route = '{0}api0.{0}api'.format(model.__name__.lower())
    app.view_functions[model_route] = get_cache(app.view_functions[model_route])

В вашем случае вы бы заменили get_cache на auth.login_required.

Обновление: как обсуждалось ниже в комментариях, аргумент в '{0}api0.{0}api' является именем таблицы, поэтому приведенный выше код будет работать, только если имена таблиц оставлены для генерации Flask-SQLAlchemy. Если модель имеет пользовательское имя таблицы, используйте его вместо model.__name__.lower().

person Miguel    schedule 02.03.2017
comment
большое спасибо, я не хочу раздражать, но я получаю эту ошибку и не могу понять, что пошло не так: app.view_functions[model_route] = auth.login_required(app.view_functions[model_route]) KeyError: 'personapi0.personapi' - person Motassem MK; 02.03.2017
comment
Упс, я понял, очевидно, flask добавляет букву s в качестве суффикса к имени класса, поэтому зарегистрированная функция для Person API называется personsapi0.personsapi, надеюсь, вы добавите это в свой ответ, и большое спасибо, это действительно решило проблему . - person Motassem MK; 02.03.2017
comment
должно быть : model_route = '{0}sapi0.{0}sapi'.format(model.__name__.lower()) - person Motassem MK; 02.03.2017
comment
@MotassemMK может быть потому, что вы используете собственное имя таблицы во множественном числе? - person Miguel; 02.03.2017
comment
опс .. да это все - person Motassem MK; 02.03.2017

Я рекомендую вам использовать Flask-Security. Существует руководство о том, как использовать это для защиты вашего интерфейса API.

person stamaimer    schedule 01.03.2017