Python 3.x 无法进行身份验证并插入mongo DB。pymongo-python
docker compose yml文件具有如下所示的mongo容器设置:Python 3.x 无法进行身份验证并插入mongo DB。pymongo-python,python-3.x,mongodb,docker-compose,pymongo,Python 3.x,Mongodb,Docker Compose,Pymongo,docker compose yml文件具有如下所示的mongo容器设置: mongo: image: mongo restart: always ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: "minu" MONGO_IN
mongo:
image: mongo
restart: always
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: "minu"
MONGO_INITDB_ROOT_PASSWORD: "strongPq23$"
我有一个python代码,如下所示:
import pymongo
import sys
class mongo_client:
def __init__(self,host,port,db,username,password):
self.client =pymongo.MongoClient(host=host,port=port,username=username,password=password,authSource=db)
self.mydb = self.client[db]
def insert_one(self,json,collection):
try:
inserted=(self.mydb[collection]).insert_one(json)
except:
print("Unexpected error while inserting into Mongo DB:", sys.exc_info()[0])
return
return inserted.inserted_id
m=mongo_client(host='127.0.0.1',port=27017,db=0,username='minu',password="strongPq23$",authSource=0
m.insert_one(some_dict,collection)
我不确定我使用的身份验证方法是否正确?我发现身份验证错误。我只想使用insert_one()插入文档,如果没有容器也没有用户,则可以使用insert_one()。您应该为根用户创建一个单独的用户,以便在pymongo代码中使用。您需要访问mongo命令行工具才能执行此操作。假设您可以运行linux客户端:
SERVER=localhost
PORT=27017
ROOT_USERNAME=root
ROOT_PASSWORD=very_strong_root_password
ADMIN_USERNAME=minu
ADMIN_PASSWORD=strongPq23$
docker run -d -p ${PORT}:27017 --name mongo -e MONGO_INITDB_ROOT_USERNAME=${ROOT_USERNAME} -e MONGO_INITDB_ROOT_PASSWORD=${ROOT_PASSWORD} --restart always mongo
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.createUser({user: '${ADMIN_USERNAME}', pwd: '${ADMIN_PASSWORD}', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.updateUser('${ADMIN_USERNAME}', {roles: [{role: 'root', db: 'admin'}]});"
然后在python运行中,这是一个测试:
import pymongo
import sys
class MyMongoClient:
def __init__(self,connection_string):
self.client =pymongo.MongoClient(connection_string)
self.mydb = self.client.db
def insert_one(self, json, collection):
try:
inserted = self.mydb[collection].insert_one(json)
except:
print("Unexpected error while inserting into Mongo DB:", sys.exc_info()[0:2])
return
return inserted.inserted_id
m = MyMongoClient(connection_string='mongodb://minu:strongPq23$@localhost:27017/your_database?authSource=admin')
print(m.insert_one({'a': 1}, 'test_collection'))
注意,这确实给了ADMIN_USERNAME非常广泛的权限,因此您可以根据需要定制这些权限。而且,一旦你有这个工作。在docker容器上装载一个卷,否则每次重新启动时所有数据都将消失。您应该为根用户创建一个单独的用户,以便在pymongo代码中使用。您需要访问mongo命令行工具才能执行此操作。假设您可以运行linux客户端:
SERVER=localhost
PORT=27017
ROOT_USERNAME=root
ROOT_PASSWORD=very_strong_root_password
ADMIN_USERNAME=minu
ADMIN_PASSWORD=strongPq23$
docker run -d -p ${PORT}:27017 --name mongo -e MONGO_INITDB_ROOT_USERNAME=${ROOT_USERNAME} -e MONGO_INITDB_ROOT_PASSWORD=${ROOT_PASSWORD} --restart always mongo
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.createUser({user: '${ADMIN_USERNAME}', pwd: '${ADMIN_PASSWORD}', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
mongo mongodb://${ROOT_USERNAME}:${ROOT_PASSWORD}@${SERVER}:${PORT}/admin?authSource=admin --eval "db.updateUser('${ADMIN_USERNAME}', {roles: [{role: 'root', db: 'admin'}]});"
然后在python运行中,这是一个测试:
import pymongo
import sys
class MyMongoClient:
def __init__(self,connection_string):
self.client =pymongo.MongoClient(connection_string)
self.mydb = self.client.db
def insert_one(self, json, collection):
try:
inserted = self.mydb[collection].insert_one(json)
except:
print("Unexpected error while inserting into Mongo DB:", sys.exc_info()[0:2])
return
return inserted.inserted_id
m = MyMongoClient(connection_string='mongodb://minu:strongPq23$@localhost:27017/your_database?authSource=admin')
print(m.insert_one({'a': 1}, 'test_collection'))
注意,这确实给了ADMIN_USERNAME非常广泛的权限,因此您可以根据需要定制这些权限。而且,一旦你有这个工作。在docker容器上装入一个卷,否则每次重新启动时所有数据都将消失。docker\u compose中已经有ROOT用户。为什么我需要管理员用户。我的问题是在容器化过程中创建的根用户,如何在代码中创建py mongo客户端时进行身份验证。使用相同的docker compose,我尝试了m=MyMongoClient(连接\u字符串=)mongodb://minu:strongPq23$@localhost:27017/您的_数据库?authSource=admin')。但这并没有起作用。在insert_one()上,我指出了设置MongoDB与pymongo一起使用所需的身份验证的正确方法。如果您想继续尝试并使用错误的方法,并且在它不起作用时继续感到惊讶,那么这取决于您。docker\u compose中已经有ROOT\u用户。为什么我需要管理员用户。我的问题是在容器化过程中创建的根用户,如何在代码中创建py mongo客户端时进行身份验证。使用相同的docker compose,我尝试了m=MyMongoClient(连接\u字符串=)mongodb://minu:strongPq23$@localhost:27017/您的_数据库?authSource=admin')。但这并没有起作用。在insert_one()上,我指出了设置MongoDB与pymongo一起使用所需的身份验证的正确方法。如果你想继续尝试并使用错误的方法,当它不起作用时继续感到惊讶,那么这取决于你。