You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask无法连接同服务器MongoDB,Python控制台可正常连接求助

Flask连接MongoDB权限问题排查

问题背景

使用Flask 1.1.2搭配MongoDB 4.2,MongoDB无用户名密码验证,配置文件未设置相关参数,但调用数据库接口时出现权限拒绝错误。本地环境可正常运行,服务器环境报错。

错误日志

[Mon Jul 10 12:00:26.064569 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594] [2023-07-10 12:00:26,063] ERROR in app: Exception on /stade/list [GET]
[Mon Jul 10 12:00:26.064596 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594] Traceback (most recent call last):
[Mon Jul 10 12:00:26.064599 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
[Mon Jul 10 12:00:26.064602 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     response = self.full_dispatch_request()
[Mon Jul 10 12:00:26.064605 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
[Mon Jul 10 12:00:26.064608 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     rv = self.handle_user_exception(e)
[Mon Jul 10 12:00:26.064610 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
[Mon Jul 10 12:00:26.064613 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     reraise(exc_type, exc_value, tb)
[Mon Jul 10 12:00:26.064615 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
[Mon Jul 10 12:00:26.064617 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     raise value
[Mon Jul 10 12:00:26.064619 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
[Mon Jul 10 12:00:26.064622 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     rv = self.dispatch_request()
[Mon Jul 10 12:00:26.064624 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
[Mon Jul 10 12:00:26.064626 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     return self.view_functions[rule.endpoint](**req.view_args)
[Mon Jul 10 12:00:26.064629 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/var/www/oneplay/oneplay_app/controllers/stade.py", line 23, in stade_list
[Mon Jul 10 12:00:26.064631 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     return stade_service.stade_list()
[Mon Jul 10 12:00:26.064633 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/var/www/oneplay/oneplay_app/services/stade.py", line 80, in stade_list
[Mon Jul 10 12:00:26.064636 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     stades = stade_repo.read_all()
[Mon Jul 10 12:00:26.064638 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/var/www/oneplay/oneplay_app/repository/stade.py", line 33, in read_all
[Mon Jul 10 12:00:26.064640 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     stades = Stade.objects()
[Mon Jul 10 12:00:26.064642 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/mongoengine/queryset/manager.py", line 38, in __get__
[Mon Jul 10 12:00:26.064645 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     queryset = queryset_class(owner, owner._get_collection())
[Mon Jul 10 12:00:26.064647 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/mongoengine/document.py", line 232, in _get_collection
[Mon Jul 10 12:00:26.064649 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     if cls._meta.get("auto_create_index", True) and db.client.is_primary:
[Mon Jul 10 12:00:26.064652 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1006, in is_primary
[Mon Jul 10 12:00:26.064681 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     return self._server_property('is_writable')
[Mon Jul 10 12:00:26.064684 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/pymongo/mongo_client.py", line 831, in _server_property
[Mon Jul 10 12:00:26.064686 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     writable_server_selector)
[Mon Jul 10 12:00:26.064688 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/pymongo/topology.py", line 231, in select_server
[Mon Jul 10 12:00:26.064703 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     address))
[Mon Jul 10 12:00:26.064705 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/pymongo/topology.py", line 189, in select_servers
[Mon Jul 10 12:00:26.064707 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     selector, server_timeout, address)
[Mon Jul 10 12:00:26.064710 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]   File "/usr/local/lib/python3.6/site-packages/pymongo/topology.py", line 205, in _select_servers_loop
[Mon Jul 10 12:00:26.064712 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594]     self._error_message(selector))
[Mon Jul 10 12:00:26.064716 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594] pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27017: [Errno 13] Permission denied
[Mon Jul 10 12:00:26.064736 2023] [wsgi:error] [pid 19007] [client 104.28.249.102:41594] 

Flask配置

MONGODB_SETTINGS = {
    "db": "db_name",
    "port": 27017,
    "host": "127.0.0.1",
}

服务器环境

  • OS: CentOS 7
  • Python: 3.6.8
  • Flask: 1.1.2
  • MongoDB: 4.2.24
  • Flask Mongoengine: 1.0.0
  • Mongoengine: 0.20
  • PyMongo: 3.9.0

测试情况

通过Python控制台可正常连接MongoDB:

Python 3.6.8 (default, Jun 20 2023, 11:53:23) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> client = pymongo.MongoClient('127.0.0.1', 27017)
>>> db = client['db_name']
>>> db.collection_names()
['init', 'stade']

本地环境无额外配置即可正常运行,请问需要进行哪些设置?


解决方案

1. 检查WSGI进程用户权限

Flask应用通过WSGI(如Apache mod_wsgi)运行时,进程用户(通常是apache或www-data)可能没有访问MongoDB套接字或数据目录的权限:

  • 查看MongoDB数据目录权限:执行ls -ld /var/lib/mongodb(若为自定义路径需调整),确认WSGI进程用户有读权限。
  • 将WSGI用户加入MongoDB组:执行usermod -aG mongodb apache(假设WSGI用户是apache),之后重启Apache服务:systemctl restart httpd。

2. 调整MongoDB绑定地址

检查/etc/mongod.conf中的net.bindIp配置,确保包含127.0.0.1,或设置为0.0.0.0(仅限内部访问场景),修改后重启MongoDB:systemctl restart mongod。

3. 处理SELinux限制

CentOS 7的SELinux可能拦截WSGI进程访问MongoDB端口:

  • 临时关闭测试:执行setenforce 0,若恢复正常,可执行以下命令永久关闭:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot
  • 或添加SELinux规则允许访问:
setsebool -P httpd_can_network_connect 1

4. 验证MongoEngine初始化配置

确保Flask应用正确加载MongoDB配置:

from flask import Flask
from flask_mongoengine import MongoEngine

app = Flask(__name__)
app.config.from_object('your_config_module')  # 替换为实际配置模块路径
db = MongoEngine(app)

内容的提问来源于stack exchange,提问作者prout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:29:50