AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1052402
Accepted
Amaimersion
Amaimersion
Asked: 2021-02-05 07:06:43 +0800 CST2021-02-05 07:06:43 +0800 CST 2021-02-05 07:06:43 +0800 CST

pymongo + flask + gunicorn:“connect=False”时第一次操作前“Authentication failed”

  • 772

我正在使用 MongoDB Atlas。我有这个 URL 用于连接:mongodb+srv://<LOGIN>:<PASSWORD>@<URL>/<DB>?retryWrites=true&w=majority&authSource=admin。

我正在使用这个堆栈:flask、gunicorn、pymongo、mongoengine(我不认为它是相关的,因为 mongoengine 实际上使用 pymongo)。

独角兽配置:

  • 同步工作者,
  • 线程 = 1,
  • 工人数 = 8

连接时,我正在使用,connect=False因为 pymongo 本身不是分叉安全的。connect=False它将在第一次操作之前连接到数据库。它需要设置为False,因为 gunicorn 使用 pre-fork 模型。

但我面临以下情况:

  1. 在第一次请求(端点进行一些数据库操作)时,我收到此错误:pymongo.errors.OperationFailure: Authentication failed., full error: {'ok': 0, 'errmsg': 'Authentication failed.', 'code': 8000, 'codeName': 'AtlasError'}
  2. 在第二次请求时,一切都很好(即,数据库操作已成功完成)。
  3. 如果你按F5多次,那么有时你会出现“验证失败”的错误,有时一切都会好起来的。

如果我准备好connect=True了,一切都会好起来的。我从未见过此“身份验证失败”错误。

但后来我收到了这个警告信息:UserWarning: MongoClient opened before fork. Create MongoClient only after forking. See PyMongo's documentation for details: https://pymongo.readthedocs.io/en/stable/faq.html#is-pymongo-fork-safe。

所以,显然,connect需要设置为False.

我接受了两名工人的测试。看起来会出现这种情况:

  1. 假设我有两个具有以下 pid 的 gunicorn 同步工作者:22429 和 22430。
  2. 我收到请求。工人 22429 处理它。一切都很好,因为它是第一个工作人员,看起来它成功地建立了数据库连接。
  3. 我按 F5,工人 22429 再次处理它,一切都很好。
  4. 我再次按 F5,现在工人 22430 处理它。它会引发错误“身份验证失败”。
  5. 我再次按 F5,工人 22430 处理它。现在一切都很好,因为那个工人已经建立了联系。
  6. 现在,我所有的工人(我只有两个)都连接到数据库。无论我按 F5 多少次,每个请求都会成功完成。

但为什么它发生在第一次请求上?来自 pymongo:“如果 connect=False,则在第一次操作时连接。”。如果我理解正确,pymongo 应该在实际第一次操作之前连接,成功完成连接,然后才执行该操作。

那为什么我的第一个数据库操作对每个工人都失败了?我应该如何处理这个?

gunicorn mongodb flask
  • 1 1 个回答
  • 916 Views

1 个回答

  • Voted
  1. Best Answer
    Amaimersion
    2021-03-24T10:19:50+08:002021-03-24T10:19:50+08:00

    实际上,问题出在 Mongoengine,而不是 PyMongo。在 Mongoengine GitHub 上,我没有找到与此问题相关的任何内容。我用 Mongoengine 尝试了很多方法来解决这个问题,但没有任何效果。唯一的解决方案是拒绝 Mongoengine 并仅使用 PyMongo。

    我重写了我的项目以仅使用 PyMongo。幸运的是,这只是项目的开始,所以并没有花太多时间。重写后,一切都按预期工作,配置完全相同。

    与此问题无关:

    对于那些考虑使用 Mongoengine 或 PyMongo 的人。使用 PyMongo。直接使用 PyMongo 要容易得多,因为它实现了实际的 MongoDB 文档。Mongoengine 改变了一些概念,最终很难阅读官方 MongoDB 文档和 Mongoengine 文档,后者以不同的方式实现了 MongoDB 文档中的一些概念。是的,通过拒绝更多的抽象,您将避免像我的问题这样的问题。

    • 0

相关问题

  • 没有 Nginx 的 ELB 后面 Gunicorn 的 Keepalive 设置

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve