如何在自定义EVE路线中编写模型

时间:2019-05-06 14:46:40

标签: python mongodb 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方法也不起作用。

2 个答案:

答案 0 :(得分:1)

为此,您需要使用事件钩子,更具体地说,是on_insert_users_hook,可在插入数据库之前对其进行修改。请参阅此处的文档和示例(https://docs.python-eve.org/en/stable/features.html#insert-events)。

答案 1 :(得分:0)

感谢gcws提示,这是我在EVE中使用flask_bcrypt生成的POST用户请求的代码:

...
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