Python Eve:412预处理在修补程序上失败

Python Eve:412预处理在修补程序上失败,python,eve,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['

我有一个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
}
我正在发送修补程序请求:

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

在这个补丁之前,我从ETag获得了一个GET请求的If匹配。执行app.data.update方法,并按预期更新数据,但我得到响应412前置条件失败。为什么?要获得200 OK,我应该怎么做?

更新
用户
文档的原因是您正在将回调函数挂接到一个。每次收到请求时,以及在处理请求之前,都会引发这些问题。在您的情况下,您可能希望将回调挂接到一个。只有在文档发送到数据库之前,请求已被验证和接受,才会引发数据库事件。在您的情况下,我会将我的函数挂接到更新时的
,该更新是根据已验证的
补丁
请求启动的。如果原始请求将被拒绝,那么这样做将防止代码对数据库执行操作,这可能是您不希望发生的事情

关于
412前置条件失败的原因,提出了合理的解决方案。。。在
PATCH
上,只有ETag不匹配时才会返回请求,因此请确保您提供了正确的请求。你在哪一个版本

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

谢谢你的回答,我正在运行Eve-0.4。我确信ETag与我从GET响应复制的ETag相匹配。即使我的字段被定义为只读,我仍然可以连接数据库事件吗?这就是我使用pre-request事件的原因。哦,是的
readonly
仅适用于来自请求负载的数据。该字段不是数据库本身的只读字段,因此您可以根据需要进行更新。我更新了我的答案,并说明了您在v0.4上获得
412
的可能原因。谢谢。我最终改变了我的设计,从字段中删除了“readonly”,并强制检查DB record insert&update。