Python开发Viber bot出现User matching query does not exist错误如何解决
故障可能原因
1. proceed_request触发范围不全
- 当前
proceed_request仅处理ViberMessageRequest类型的请求:如果用户首次和Bot交互是通过订阅、点击菜单按钮、触发回调等非消息类请求(比如ViberSubscribedRequest、ViberConversationStartedRequest),就不会进入用户创建逻辑,数据库自然没有对应记录。 - 建议补充其他用户首次触达的请求类型判断,覆盖全场景。
2. 条件判断逻辑冗余引发并发问题
- 代码已经使用了
update_or_create方法,这个方法本身就会自动判断记录是否存在,不存在则创建、存在则更新,外层额外加的if not User.objects.filter(...).exists()完全多余。 - 高并发场景下,可能出现两个请求同时通过exists判断的情况,触发唯一键冲突,导致用户创建失败,最终没有入库。直接删掉外层的exists判断即可。
3. 数据库字段约束导致创建失败
- 检查
User模型的字段配置:比如name、country、language是否设置了null=False/blank=False,如果用户的Viber账号没有填写对应信息,viber_request返回的对应字段为空,就会触发数据库约束报错,用户创建失败。 - 建议给非必填字段加允许为空的配置,或者给空值设置默认兜底值。
4. send_confirmation方法的变量来源错误
- 你贴的
send_confirmation方法接收的参数是confirmation,但代码里直接使用了data变量,如果data不是全局变量、也没有在方法内正确初始化,data.get('viber_id')会返回None,自然查不到对应用户。 - 需要确认
data变量的来源是否正确,或者改为从confirmation参数中提取用户ID。
5. 事务回滚导致创建失效
- 如果
proceed_request执行用户创建操作后,后续逻辑抛出异常且处于同一个数据库事务中,会导致已经执行的用户创建操作被回滚,最终数据库没有对应记录。 - 可以排查
proceed_request后续执行逻辑是否有报错,或者将用户创建操作单独提前执行,避免被其他无关逻辑影响。
内容的提问来源于stack exchange,提问作者AnotherManHere911
相关产品推荐
相关产品推荐

