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
相关产品推荐
相关产品推荐

