python 夏娃 : 412 Precondition Failed on PATCH

标签 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

最佳答案

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

浅谈原因412 PRECONDITION FAILED养得很好... PATCH仅当 ETag 不匹配时才会返回请求,因此请确保您提供正确的请求。另外您使用的是哪个 Eve 版本?

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

关于 python 夏娃 : 412 Precondition Failed on PATCH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27142276/

相关文章:

python - 制作对象的非阻塞版本的 Pythonic 方法是什么?

python - 将句子拆分成新行

python - Eve (Flask) 应用程序对 uWSGI 没有任何内容响应

Python Eve 包含过滤器

python - 夏娃框架: modify query_string

python - 了解 python asyncio 协议(protocol)

python - 将两个列表列表压缩在一起 - Python

python - 不带语法糖的带有参数的修饰符的等效含义是什么?

linux - 从 Internet 访问 Python Web 应用程序

python - 通过 HTTPS 运行 Eve