无法通过Flask应用程序访问容器中的MongoDB

时间:2018-11-15 16:48:05

标签: python mongodb docker flask mongoengine

所以,伙计们,希望你能帮助我。

所以我现在正深入docker容器,我尝试将我的应用程序(flask + mongodb)移植到两个单独的容器中。 MongoDB容器已设置并且运行良好,运行带有链接的mongoexpress容器使我可以访问所需的数据库。现在,我移植了Flask应用程序,并且登录页面加载正常(因此docker端口本身可以工作),但是即使我运行的容器带有指向数据库容器的链接,当我尝试从数据库加载内容时,也会出现服务器错误。

日志为我提供了以下追溯:

File "/usr/local/lib/python3.7/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
    queryset = queryset_class(owner, owner._get_collection())
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 190, in _get_collection
    db = cls._get_db()
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 179, in _get_db
    return get_db(cls._meta.get('db_alias', DEFAULT_CONNECTION_NAME))
File "/usr/local/lib/python3.7/site-packages/mongoengine/connection.py", line 241, in get_db
    db = conn[conn_settings['name']]
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1323, in __getitem__
    return database.Database(self, name)
File "/usr/local/lib/python3.7/site-packages/pymongo/database.py", line 107, in __init__
    "of %s" % (string_type.__name__,))
TypeError: name must be an instance of str

所以我的Flask-MongoEngine设置如下:

app = Flask(__name__)
app.config["MONGODB_DB"] = 'database-name'
db = MongoEngine(app)

基本上我的数据库应该在本地主机上的标准端口27017上可用。当与Flask连接到容器时,我是否需要考虑什么?或者该链接是否未按预期公开端口?mongoexpress可以工作并且具有访问权限,所以我的设置一定有问题。

2 个答案:

答案 0 :(得分:0)

至少将它放在您的设置中

app.config['MONGODB_HOST'] = 'mongo'

mongoexpress起作用的原因是,它默认情况下在名为mongo的主机上查找mongo,因此当您执行docker run -it --rm -p 8081:8081 --link YOUR_MONGODB_CONTAINER:mongo mongo-express时,它可以找到链接的mongo实例。但是,在flask-mongoengine中,主机默认为localhost。

答案 1 :(得分:0)

最后,事情比我想象的要简单。当我将代码从Apache2迁移到Nginx时,我的代码流程发生了变化,而没有引起我的注意。因此,我根本没有调用Flask的配置行。