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

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

в моем приложении я использую Flask и flask_restless"s 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 декоратор.

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

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(),

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

Другие вопросы по тегам