Как написать модель в пользовательском маршруте EVE

Я немного поэкспериментировал с EVE и столкнулся с вопросом, как манипулировать данными в пользовательских конечных точках. Пример: мне нужен «пользовательский» метод POST, где я могу перехватить данные, хешировать пароль и затем сохранить нового пользователя.

Для этого я хотел бы перезаписать или расширить существующий метод POST. Моя попытка:

@app.route('/users', methods=['POST'])
def create_user():
    user = app.data.driver.db['user']
    print(request.json)
    username = request.json.get('username')
    password = request.json.get('password')
    if username is None or password is None:
        abort(400)  # arguments are missing
    if user.find({ 'username': username}) is not None:
        abort(400)  # user is existing
    => hash password
    => save user with hashed password

К сожалению, перезапись метода POST, созданного моей пользовательской моделью, также не работает.


person Gurkenkönig    schedule 06.05.2019    source источник


Ответы (2)


Для этого вам нужно использовать обработчик событий, а точнее on_insert_users_hook, где вы можете изменить элемент перед вставкой в ​​базу данных. См. документацию и пример здесь (https://docs.python-eve.org/en/stable/features.html#insert-events).

person gcw    schedule 07.05.2019

Благодаря подсказке gcws, вот мой результирующий код для пользовательского запроса POST в EVE с flask_bcrypt:

...
from flask import request    
from flask_bcrypt import Bcrypt

...

bcrypt = Bcrypt()


def pre_user_post_callback(request):
    print('A POST on "user" was just performed!')

    pw_hash = bcrypt.generate_password_hash(request.json["password"], 12)
    del request.json["password"]
    request.json["password_hash"] = pw_hash.decode()

    print(bcrypt.check_password_hash(request.json["password_hash"] , '12345')) #  True if requested pw is 12345



app.on_pre_POST_user += pre_user_post_callback
person Gurkenkönig    schedule 08.05.2019