2

我有一个带有以下相关代码的 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

4

1 回答 1

2

更新文档的原因users是您将回调函数连接到Pre-Request Event。每次收到请求并在处理请求之前都会提出这些请求。在您的情况下,您可能希望将回调挂钩到Database Event仅在将文档发送到数据库之前立即验证并接受请求时才会引发数据库事件。在您的情况下,我会将在经过验证的请求on_update时触发的函数挂钩。PATCH如果原始请求将被拒绝,那么这样做会阻止您的代码对数据库执行操作,而您可能不希望发生这种情况。

关于为什么412 PRECONDITION FAILED提出很好的原因......关于PATCH仅在 ETag 不匹配时才返回的请求,因此请确保您提供正确的请求。还有你是哪个 Eve 版本的?

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

于 2014-11-26T06:52:48.420 回答