我有一个在 Alma Linux 上运行的 apache 服务器。我有 Flask 代码设置来接受来自远程连接的 API 调用。所以我的 API 调用命中了 Flask,然后它连接到 MySQL 数据库。
当我尝试在服务器内部本地运行此数据库连接代码时,它工作正常。但是当我尝试通过远程 API 调用来访问 Flask 应用程序时,我得到
Database error: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (13)
这很奇怪,因为我可以在服务器内部本地连接到数据库。
我还编写了一个虚拟端点。
@app.route('/')
def test_endpoint():
return 'Hello World'
这个端点有效来自远程 API 调用。
我用于连接数据库的代码
import mysql.connector
from flask import Flask
app = Flask(__name__)
df_config = {connection parameters}
@app.route('/db_test', methods=['GET','POST'])
def db_test():
try:
conn = mysql.connector.connect(**db_config)
return Statement
except Error as e:
return jsonify({'success': False, 'message': f"Database error: {e}. Contact the researcher"}), 500
我检查了 MySQL 正在端口 3306 上运行,并且我拥有必要的数据库权限。我还尝试在 MySQL 配置文件中注释“bind-address = 127.0.0.1”。
请帮助我修复。
听起来像是你的 Flask 应用程序在尝试通过
localhost
连接到 MySQL 数据库,而
localhost
在 Apache 的上下文中指的是 Apache 服务器本身,而不是运行你的 Flask 应用程序的机器。
你可以尝试以下几种解决方案:
1. 使用实际的数据库主机名或 IP 地址:
-
将你的数据库连接配置中的
localhost
替换为你的 MySQL 数据库服务器的实际主机名或 IP 地址。
2. 在 Apache 配置中设置环境变量:
- 你可以在 Apache 配置文件中设置一个环境变量,其中包含你的数据库主机名或 IP 地址,并在你的 Flask 应用程序中使用该环境变量。
-
例如,在你的 Apache VirtualHost 配置中添加以下内容:
apache SetEnv DB_HOST your_database_host
-
然后在你的 Flask 应用程序中,你可以这样使用环境变量: ```python import os
db_config = { 'host': os.environ.get('DB_HOST'), # ... 其他数据库连接参数 } ```
3. 使用 Unix Socket 连接到 MySQL:
- 如果你的 Flask 应用程序和 MySQL 数据库服务器在同一台机器上运行,你可以使用 Unix Socket 连接到数据库,而不是使用 TCP/IP 连接。
-
将你的数据库连接配置中的
host
参数设置为/var/run/mysqld/mysqld.sock
或你的 MySQL Unix Socket 文件的实际路径。
检查防火墙和 SELinux:
- 确保你的防火墙没有阻止从你的 Flask 应用程序到 MySQL 数据库服务器的连接。
- 如果你正在使用 SELinux,请确保它没有阻止连接。你可以暂时禁用 SELinux 进行测试。
其他建议:
- 在你的 Flask 应用程序中添加更多详细的日志记录,以帮助你诊断问题。
-
使用
telnet
或nc
命令测试从运行你的 Flask 应用程序的机器到 MySQL 数据库服务器的网络连接。
通过尝试这些解决方案,你应该能够解决数据库连接问题,并让你的 Flask 应用程序能够从远程 API 调用访问 MySQL 数据库。
标签:python,mysql,linux,apache,flask From: 78789998