Python 3.x 无法进行身份验证并插入mongo DB。pymongo-python

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

docker compose yml文件具有如下所示的mongo容器设置:

         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一起使用所需的身份验证的正确方法。如果你想继续尝试并使用错误的方法,当它不起作用时继续感到惊讶,那么这取决于你。