【问题标题】:Flask Pymongo Insert烧瓶 Pymongo 插入
【发布时间】:2024-04-24 22:10:02
【问题描述】:

我正在调用 db dev 将数据插入其集合中。但它正在创建一个新集合并将数据插入admin db。

from app import app
from flask import Flask
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo

@app.route('/')
@app.route('/index')
def index():
    return "Hello, World!"

app.config['MONGO_DBNAME'] = 'dev'
app.config['MONGO_AUTH_SOURCE'] = 'admin'
app.config['MONGO_URI'] = 'mongodb://<user>:<password>@<url>:27017/admin'

mongo = PyMongo(app)

@app.route('/mongo', methods=['GET'])
def get_all_docs():
  doc = mongo.db.abcd.insert({'abcd':'abcd'})
  return "Inserted"

if __name__ == '__main__':
    app.run(debug=True)

我错过了什么吗?

PS:我尝试用dev 替换admin。它给了pymongo.errors.OperationFailure: Authentication failed. 我猜那是因为身份验证数据在admin db 中。

app.config['MONGO_URI'] = 'mongodb://&lt;user&gt;:&lt;password&gt;@&lt;url&gt;:27017' 这也不起作用。

【问题讨论】:

  • 为什么不简单地'mongodb://&lt;user&gt;:&lt;password&gt;@&lt;url&gt;:27017/dev'?如果您正在阅读告诉您将 AUTH_SOURCE 或“admin”设置为数据库的帖子,那么这些来源确实已经过时了。驱动程序在“默认”下查看"admin" 以获得授权,并且您应该只需要有意使用不同命名空间的其他选项。由于您使用的是默认设置,因此不需要其他设置。
  • @NeilLunn pymongo.errors.OperationFailure: Authentication failed. 当我使用 dev 代替 admin 时。我在上面提到过。
  • 连接实际使用的是什么?用 mongoengine 标记的问题。您实际上是在使用它还是在您自己的代码中调用原始 pymongo 驱动程序,但此处未显示?因为任何一个AFAIK都没有使用PyMongo(app)调用。最重要的是您确定该帐户实际上可以访问dev 数据库吗?您是否真的尝试过使用来自其他来源的帐户连接和使用集合?
  • @NeilLunn 我打电话给 pymongo 驱动程序。是的,我可以访问开发数据库。我还有其他几个连接正常。
  • PyMongo 不是 pymongo 驱动程序的导出。您“应该”使用MongoClient 进行连接。这使我认为问题中没有显示您自己的代码是问题的实际根源。请实际显示应用连接详细信息的代码。

标签: python mongodb flask flask-pymongo


【解决方案1】:

在 MONGO_URI 中将 admin 替换为 dev 会导致 Authentication Error
添加authSource 将使用admin db 进行身份验证。
为此,请将admin 替换为dev?authSource=admin

from app import app
from flask import Flask
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo

@app.route('/')
@app.route('/index')
def index():
    return "Hello, World!"

app.config['MONGO_URI'] = 'mongodb://<user>:<password>@<url>:27017/dev?authSource=admin'

mongo = PyMongo(app)

@app.route('/mongo', methods=['GET'])
def get_all_docs():
  doc = mongo.db.abcd.insert({'abcd':'abcd'})
  return "Inserted"

if __name__ == '__main__':
    app.run(debug=True)

【讨论】: