使用数据库连接将代码部署到 Azure Web 时,Flask 应用程序无法呈现,但在本地服务器上工作正常

Posted

技术标签:

【中文标题】使用数据库连接将代码部署到 Azure Web 时,Flask 应用程序无法呈现,但在本地服务器上工作正常【英文标题】:Flask app fails to render when deploying code to Azure Web with a database connection, but works fine from local server 【发布时间】:2015-08-05 07:14:00 【问题描述】:

我有一个带有 Flask 模板的 Azure Web 应用。我希望它连接到 SQL 数据库。我做了一个。我安装了pymssql。出于测试目的,我添加到根文件夹中的 views.py 中:

import pymssql
conn = pymssql.connect(server='mydb.database.windows.net', user='mydbnameadmin@mydb', password='secret', database='mydb')

我首先在我的 kubuntu 机器上进行了本地测试。为了确保我得到了连接,我输入了错误的密码,服务器抛出了一个错误。我输入正确,错误消失了。凉爽的。 azure 门户上的 SQL 仪表板也报告了成功的连接。然后我将我的更改(包括更新 requirements.txt)推送到我的 github 存储库,它被吸入了我的 Web 应用程序。当我尝试运行网络应用程序时,在索引页面上:

页面无法显示,因为内部服务器错误 发生了。

打开并检查详细日志后,我得到了它:

HTTP Error 500.0 - Internal Server Error
The page cannot be displayed because an internal server error has occurred.
Most likely causes:

IIS received the request; however, an internal error occurred during the processing of the request. The root cause of this error depends on which module handles the request and what was happening in the worker process when this error occurred.
IIS was not able to access the web.config file for the Web site or application. This can occur if the NTFS permissions are set incorrectly.
IIS was not able to process configuration for the Web site or application.
The authenticated user does not have permission to use this DLL.
The request is mapped to a managed handler but the .NET Extensibility Feature is not installed.

IIS。那在这里做什么?我认为 MS 很时髦,并将此服务托管在 linux 机器上 0_0

我删除第二行

conn = pymssql.connect(server='mydb.database.windows.net', user='mydbnameadmin@mydb', password='secret', database='mydb')

错误消失了。如果我在本地运行仍然使用 Azure SQL 服务器的服务器,则没有任何问题。

这似乎与我遇到的问题相同: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e20bb2a3-bdbe-4e49-8b92-b36fe50577da/having-trouble-deploying-flask-app-into-azure-with-azure-database?forum=windowsazurewebsitespreview&prof=required

但他们说他们是否真的让它与 SQL 数据库一起工作......

人们怎么看? 谢谢

我的要求.txt

alembic==0.7.7
azure==0.11.1
Flask==0.10.1
Flask-Migrate==1.5.0
Flask-Script==2.0.5
Flask-SQLAlchemy==2.0
futures==3.0.3
itsdangerous==0.24
Jinja2==2.8
Mako==1.0.1
MarkupSafe==0.23
pymssql==2.1.1
python-dateutil==2.4.2
six==1.9.0
SQLAlchemy==1.0.8
Werkzeug==0.10.4
wheel==0.24.0

【问题讨论】:

【参考方案1】:

据我了解,Azure 网站默认托管在 Windows Server 2012 VM 上,它不会安装 FreeTDS,而且我们也无权安装它。而pymssql 是基于FreeTDS

所以我们可以使用pyodbc 连接Azure SQL 作为一种解决方法来轻松处理它。

【讨论】:

【参考方案2】:

我能够使用 pymssql 2.1 库成功地将我的 Python 代码连接到 Azure 上的 SQL 数据库。

我不知道这是否是导致问题的原因,但我确实在我的连接字符串中包含了几个额外的参数......也许这会有所帮助。我明确指定了驱动程序和 Encrypt 参数,因为 SSL 始终为 SQL Azure 启用(我相信)

myConnection = pyodbc.connect('Driver=SQL Server;'
'Server=tcp:1234567.database.windows.net,1433;'
'Database=MyAzureDatabase;'
'Uid=geekgirl@123456;Pwd=abcdef;'
'Encrypt=yes')

如果这不起作用,可以尝试在连接语句周围添加一些错误处理以尝试获取更具体的错误消息。

手指交叉!

【讨论】:

您说使用 pymssql 库,但您有一个 pyodbc 对象。你指的是哪一个? :) 还有什么对pyodbc的依赖,将其添加到requirements.txt中,pip安装失败 pyodbc 不需要任何依赖项,我只是复制了您的 requirements.txt 并在其中添加了pyodbc 并运行env/Scripts/pip.exe install -r requirements.txt,对我来说效果很好。虽然我是在 Windows 中,但我认为在 Linux 中是一样的。更多详情我们可以在Creating web apps with Django in Azure 编辑:我的网络应用程序现在正在运行。但是在我的开发环境(linux)中,如果我尝试运行本地服务器,我会得到 myConnection = pyodbc.connect('Driver=SQL Server;' pyodbc.Error: ('IM002', '[IM002] [ unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)'). 我想我需要安装一些数据库驱动程序【参考方案3】:

我遇到了这个问题,但我最终意识到这是因为我在 Visual Studio 中使用的是 64 位版本的 Python,而 Azure 只支持 32 位版本。

我看到了:

DLL load failed: %1 is not a valid Win32 application.

一旦我切换到安装和使用 32 位版本,我就可以毫无问题地使用 Flask 和 pyodbc。

【讨论】:

以上是关于使用数据库连接将代码部署到 Azure Web 时,Flask 应用程序无法呈现,但在本地服务器上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

将 WebJob 部署到 Azure 时出错?

使用 Travis CI 将代码从同一分支部署到多个 Azure Web 应用程序

通过 Azure Devops 将 .Net Core 3.1 Web 应用程序部署到 Azure Linux Web 服务时出错

Azure YAML 部署失败并显示“错误:无法将 Web 包部署到应用服务。冲突(代码:409)”

我应该使用 Docker 将 Web API 项目(微服务)部署到 Azure Web App [关闭]

在 Azure Web 应用/Azure API 上部署时缺少 CORS 标头