Python Eve:412前提条件在PATCH上失败

时间:2014-11-26 05:56:38

标签: python eve

我有一个Python Eve应用程序,其中包含以下相关代码:

def handle_user_update(request, lookup):
if request and request.data:
    data = json.loads(request.data)
    users = app.data.driver.db['users']
    user = users.find_one(ObjectId(lookup['_id']))
    if user and user['activation_code'] == data['activation_code']:
        app.data.update('users', ObjectId(lookup['_id']), {'active':True})
    else:
        abort(403)

app = Eve()

if __name__ == '__main__':
    app.on_pre_PATCH_users += handle_user_update
    app.run(host='0.0.0.0')

定义字段:

'active': {
    'type': 'boolean',
    'readonly': True,
    'default': False
},
'activation_code': {
    'type': 'string',
    'readonly': True
}

我发送了一个PATCH请求:

If-Match:       c8f9351a7527f8aa1db191fe85017df1dbca961f
{"activation_code": "8f775627d1144dbd8367778e8680ed58"}

我从此PATCH之前发送的GET请求的ETag获得了If-Match。 app.data.update方法执行并且数据按预期更新,但是我得到响应 412 PRECONDITION FAILED 。为什么?我该怎么办才能 200 OK

1 个答案:

答案 0 :(得分:2)

您的users文档正在更新的原因是您正在将回调函数挂钩到Pre-Request Event。每次收到请求时都会引发这些请求,并且在处理之前。在您的情况下,您可能希望将回调挂钩到Database Event。数据库事件仅在已经验证并接受请求时引发,在文档发送到数据库之前 。在你的情况下,我会将我的函数挂钩到on_update,这是在经过验证的PATCH请求上触发的。这样做会阻止您的代码在原始请求被拒绝的情况下对数据库采取行动,这可能是您不希望发生的事情。

关于412 PRECONDITION FAILED被提出的原因...... PATCH请求仅在ETag不匹配时才返回,因此请确保提供正确的请求。还有哪个夏娃版本?

UPDATE 在v0.4上,如果users也是请求的目标,那么一旦执行自定义写入(文档表示更改),ETag就会更改,以便在稍后获得412时进行解释上。