首页 > 编程问答 >无法在我的 apache 服务器内对 Flask 应用程序(用于 MySQL 连接)进行远程 api 调用

无法在我的 apache 服务器内对 Flask 应用程序(用于 MySQL 连接)进行远程 api 调用

时间:2024-07-25 06:02:58浏览次数:16  
标签:python mysql linux apache flask

我有一个在 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

相关文章

  • 在 python requests modul 中,如何检查页面是否使用“POST”方法或“GET”方法
    如何使用python“requests”模块检查页面是否使用“GET”方法或“POST”方法。我期望输出为True或False,或者GET或Post预期代码:importrequestsurl=f"www.get_example.com"response=requests.get(url)ifresponse.check_get==True:print("get")你......
  • VS Code Python - 如果括号(括号、大括号等)未关闭,内联建议不起作用
    我遇到的问题是,当我在未闭合的括号或方括号“内部”开始变量名称时,VSCode将不会显示任何建议。但是,如果在键入变量名称之前闭合括号,则建议效果很好。如果我可以避免它,我宁愿不将自动完成括号关闭设置为True也不使用TabOut扩展。第一个屏幕截图显示建议在闭括号/方......
  • 在 Azure 上部署代码时使用 Python 的多处理模块是否有意义?
    我们的团队在Azure机器学习(AML)上部署了一个Python脚本来处理存储在Azure存储帐户上的文件。我们的管道由一个ForEach活动组成,该活动调用每个或列出的文件的Python脚本。从Azure数据工厂(ADF)运行它会触发多个单独的管道同时运行......
  • 我已成功安装 pypdf2 但无法将其导入到我的 python 文件中
    我已经成功安装了pypdf2模块,但在导入它时,我发现该模块丢失了。我尝试使用fromPyPDF2importPdfReader导入,但它不起作用此问题的各种解决方案是什么?在尝试导入PyPDF2时遇到问题。以下是可能导致此问题的一些常见原因和解决方案:安......
  • Python3打开图片时请求ConnectionResetError(10054)
    我试图从'http://xxx.jpg'之类的网站下载图片。代码:headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.139Safari/537.36'}url='http://xxx.jpg'resp......
  • Jupyter Notebook 环境中的 Python 版本不匹配
    我遇到Jupyter笔记本启动横幅中报告的Python版本与我在笔记本中查询python--version时显示的版本之间的差异。启动横幅指示Python3.11.9,但是当我运行!python--version时,它返回Python3.11.7。我所做的步骤:basecondahas3.11.7versio......
  • Python XML 解析:字符串中的“<”被阻塞
    我有一个使用ET.XMLParser来解析CppCheckXML报告文件的Python模块。当尝试解析字符串中包含“<”的XML元素中的属性之一时,它会令人窒息,它会将其解释为格式错误的XML,例如:<errormsg="Includefile<iostream>notfound.">(注意字符和“iostream”之间的空格必须放......
  • 任意几行代码要成为Python中的函数需要什么?
    我正在上一门计算机科学课,我的任务是创建一个程序来实现一个带有参数的函数。我的老师告诉我,下面的代码不是一个函数,这让我很困惑,对于将某些代码行归类为“函数”所需的条件,我感到很困惑。defgame(numbers,max_turns,pfl,tgl):turns=0flag=Falseprint("You......
  • 如何使用 Python 创建新的 Azure 订阅?
    我正在尝试使用PythonSDK以编程方式创建新的Azure订阅。我发现的对AzurePythonSDK的唯一引用是这个这是我最终得到的结果:importazure.mgmt.billingimportazure.mgmt.subscriptioncreds=AzureCliCredential()client_name='test'defcreat......
  • Flask-WTF:如何在 Flask FormField 中定义自定义变量
    我正在尝试在Flask中设置一个动态表单,其中该表单具有动态填充的FormFieldsFieldList。虽然大部分都有效,但我不断遇到每个FormField的变量问题。我需要每个FormField有一个标签,它是FormField的名称(并在页面上呈现)和一个在显示/隐藏脚本中使用的自定义ID,该脚本使用动态......