14

I'm sure that the MONGO_URI is correct because it works well in pymongo. but when using flask_pymongo, it doesn't work... here is my test code:

from flask import Flask
from flask_pymongo import PyMongo
app = Flask(__name__)

app.config['MONGO_URI'] ='mongodb://root:aaa2016@localhost:27017/mongo_test'
mongo = PyMongo(app, config_prefix='MONGO')


@app.route('/')
def hello_world():
    mongo.db.user.insert({'username': "aaa"})
    return 'Hello World!'


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

run it and visit 127.0.0.1:5000, a response of 500 is given..

OperationFailure: Authentication failed.
127.0.0.1 - - [21/Jun/2016 20:40:25] "GET / HTTP/1.1" 500 -

any help will be appreciated.

update: here is the traceback:

File "C:\Python27\lib\site-packages\flask\app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1567, in       handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1641, in  full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "F:\PycharmProjects\flask_\flask_.py", line 12, in hello_world
mongo.db.user.insert({'username': "aaa"})
File "C:\Python27\lib\site-packages\pymongo\collection.py", line 2203, in insert
with self._socket_for_writes() as sock_info:
File "C:\Python27\lib\contextlib.py", line 17, in __enter__
return self.gen.next()
File "C:\Python27\lib\site-packages\pymongo\mongo_client.py", line 718, in _get_socket
with server.get_socket(self.__all_credentials) as sock_info:
File "C:\Python27\lib\contextlib.py", line 17, in __enter__
return self.gen.next()
File "C:\Python27\lib\site-packages\pymongo\server.py", line 152, in get_socket
with self.pool.get_socket(all_credentials, checkout) as sock_info:
File "C:\Python27\lib\contextlib.py", line 17, in __enter__
return self.gen.next()
File "C:\Python27\lib\site-packages\pymongo\pool.py", line 541, in get_socket
sock_info.check_auth(all_credentials)
File "C:\Python27\lib\site-packages\pymongo\pool.py", line 306, in  check_auth
auth.authenticate(credentials, self)
File "C:\Python27\lib\site-packages\pymongo\auth.py", line 436, in authenticate
auth_func(credentials, sock_info)
File "C:\Python27\lib\site-packages\pymongo\auth.py", line 416, in _authenticate_default
return _authenticate_scram_sha1(credentials, sock_info)
File "C:\Python27\lib\site-packages\pymongo\auth.py", line 188, in _authenticate_scram_sha1
res = sock_info.command(source, cmd)
File "C:\Python27\lib\site-packages\pymongo\pool.py", line 213, in command
read_concern)
File "C:\Python27\lib\site-packages\pymongo\network.py", line 99, in command
helpers._check_command_response(response_doc, None, allowable_errors)
File "C:\Python27\lib\site-packages\pymongo\helpers.py", line 196, in _check_command_response
raise OperationFailure(msg % errmsg, code, response)
OperationFailure: Authentication failed.
4
  • Can you show us the code you used to confirm that it works when using PyMongo directly? Commented Jun 21, 2016 at 13:22
  • import pymongo connection = pymongo.MongoClient('mongodb://root:aaa2016@localhost:27017/') db = connection.mongo_test db.user.insert({'username': "aaa"}) it works well........@dim Commented Jun 21, 2016 at 13:27
  • Please edit your original question and make sure to include all relevant code. Importing PyMongo isn't enough to confirm that you can connect to the database. Commented Jun 21, 2016 at 13:28
  • there are all my test codes,and they are almost same to the video shows to me in youtube @dirn Commented Jun 21, 2016 at 13:36

4 Answers 4

15

This question may be old, but I was experiencing the same issue and found another solution that might work for others.

Appending ?authSource=admin to the end of your MONGO_URI variable will authenticate your credentials against the admin database, rather than the one you're connecting to.

Example: app.config["MONGO_URI"] = "mongodb://username:password@host:port/db_name?authSource=admin"

Sign up to request clarification or add additional context in comments.

1 Comment

The simplest solution of all! Thanks! 👍
13

The problem is if you use the MONGO_URI config parameter then pymongo attempts to authenticate against the db name included in the string. You should break up the config parameters into the following so you can specify a db name and an auth source.

app.config['MONGO_HOST'] = 'localhost'
app.config['MONGO_PORT'] = '27017'
app.config['MONGO_DBNAME'] = 'mongo_test'
app.config['MONGO_USERNAME'] = 'root'
app.config['MONGO_PASSWORD'] = 'aaa2016'
app.config['MONGO_AUTH_SOURCE'] = 'admin' . # root user is typically defined in admin db

2 Comments

May I ask why MONGO_AUTH_SOURCE is essential? I execute db.authenticate(name=xx, password=xxx), it failed. But it succeed by adding source='admin'.
I believe that lets pymongo know which db table holds the credentials to authenticate with.
2

If you are using Flask-MongoEngine and setting mongo config using app.config['MONGODB_*'] then, your uri will be generated from those variables e.g.

app.config['MONGODB_DB'] = 'project1'
app.config['MONGODB_HOST'] = '192.168.1.35'
app.config['MONGODB_PORT'] = 12345
app.config['MONGODB_USERNAME'] = 'webapp'
app.config['MONGODB_PASSWORD'] = 'pwd123'

However, if you need to add some additional paramters (such query parameter authSource=admin) to uri then, you will have to pass mongo config through app.config['MONGODB_SETTINGS']

app.config['MONGODB_SETTINGS'] = {
    'connect': False,
    'host': 'mongodb://webapp:[email protected]:12345/project1?authSource=admin'
}

Comments

0

This is pretty much what it worked for me using flask_pymongo:

from flask import Flask
from flask_pymongo import PyMongo

app = Flask(__name__)
app.config['MONGO_URI']='mongodb://appUser:passwordForAppUser@localhost/app_db?authSource=admin'

mongo=PyMongo(app)

Or you can also try this other example using MongoEngine instead:

from flask import Flask
from flask_mongoengine import MongoEngine
    
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
        'db': 'app_db',
        'host': 'localhost',
        'port': 27017,
        'username': 'appUser',
        'password': 'passwordForAppUser',
        'authentication_source': 'admin'
}

db = MongoEngine(app)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.