现代化 Azure 上的 Python 应用和数据 - 第 1 部分:简介





5.00/5 (3投票s)
本系列的第一篇文章介绍了本系列的目标:演示如何在 Azure 上实现旧版 Python 应用程序及其数据的现代化。
许多 Python 开发团队都知道他们需要使其应用程序现代化,但不确定从何开始、如何操作或使用哪些工具。
这个由六部分组成的系列文章将演示如何在 Azure 上实现 Python 应用程序和数据的现代化。我们将从一个传统的单一 Python 应用程序开始,该应用程序由 Django RealWorld 示例应用程序表示。
Django 是一个成熟、功能齐全的 Python 应用程序 Web 框架。然而,对于较小的项目来说,Django 可能有些大材小用,因为它鼓励开发大型的单一应用程序。开发人员通常会考虑其他 Python Web 框架来开发微服务。
假设您的组织希望逐步摆脱 Django,而又不放弃您已投入到应用程序中的工作。在这种情况下,Azure 可以帮助您顺利过渡到云原生微服务。
第一篇文章将在本地运行后端 Django RealWorld 应用程序,并进行少量更改以用 PostgreSQL 数据库替换 SQLite。您可以按照本文中的步骤运行您的应用程序,或者下载并打开此 GitHub 存储库文件夹以获取最终项目。您应该了解 Python 和 Django 才能继续。
在本系列文章的后面部分,我们将展示如何通过将应用程序及其数据迁移到 Azure 来实现现代化。然后,我们将逐步使用云原生服务扩展应用程序的功能,并展示如何将应用程序的数据迁移到 Cosmos DB。
现在,让我们从准备将旧版应用程序迁移到云开始。
要求
在安装和测试应用程序之前,请确保您具备应用程序正常运行所需的所有要求
- 下载并安装 Visual Studio Code。
- 下载并安装 VS Code Python 扩展。
- 从 Real World Example 存储库克隆或下载原始的、基于 SQLite 的后端代码。
- 按照安装说明在本地开发机器上设置 Django 后端应用程序。
- 下载并安装 PostgreSQL,以便以后代替 SQLite 使用。
- 下载并安装 Postman。
准备 PostgreSQL 数据库
在本节中,我们将用示例数据填充应用程序,以便在下一篇文章中迁移数据。我们还将对默认的 RealWorld 应用程序进行一个小改动:使用 PostgreSQL 而不是 SQLite。PostgreSQL 更能代表开发团队希望在云中实现现代化的单一应用程序。
首先,确保您可以从终端运行 PostgreSQL 命令行界面 (CLI)。因此,将 _\bin_ 和 _\lib_ 文件夹添加到系统的 Path 中。例如,在我的 Windows 机器上,我必须将以下文件夹添加到 Path 环境变量中
C:\Program Files\PostgreSQL\14\bin
C:\Program Files\PostgreSQL\14\lib
现在,打开终端并输入以下命令连接到 PostgreSQL CLI,然后提供您首次安装 PostgreSQL 时定义的主密码
postgres=# create database conduit_db;
CREATE DATABASE
接下来,为 Conduit 应用程序创建一个新的 `conduit_db 数据库`
postgres=# create database conduit_db;
CREATE DATABASE
最后,创建一个新的 conduit_user 以连接到您的 `conduit_db` 数据库
postgres=# create user conduit_user with password '123456';
CREATE ROLE
配置应用程序以使用 PostgreSQL
现在您需要修改 _\conduit\settings.py_ 文件中的 `DATABASES` 常量,以指向 PostgreSQL 而不是 SQLite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'conduit_db',
'USER': 'conduit_user',
'PASSWORD': '<<YOUR-MASTER-PASSWORD>>',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
然后,打开 _requirements.txt_ 文件并添加 psycopg2 的以下依赖项,这是一个用于 Python 编程语言的 PostgreSQL 数据库适配器
psycopg2==2.7.5
psycopg2-binary==2.7.5
在本地运行 Real-World 应用程序
在运行应用程序之前,让我们创建一个与系统目录隔离的虚拟环境。这样,我们就可以独立地为新项目安装一组 Python 包。
首先,执行 `venv` 命令创建一个专用的目标目录
> python -m venv ./venv
然后,激活 venv 环境
> ./venv/Scripts/activate
接下来,在虚拟环境中安装所有要求
(venv) > pip install -r requirements.txt
我们现在有了 PostgreSQL 数据库,但仍然没有数据库模式。因此,执行 `migrate` 命令以创建 PostgreSQL 数据库以及应用程序所需的所有模式
> python manage.py migrate
最后,通过执行 runserver 命令运行应用程序
> python manage.py runserver
Django version 1.10.5, using settings 'conduit.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
在浏览器中打开 http://127.0.0.1:8000/api 以确认后端正常工作
用示例数据填充应用程序
不幸的是,当前代码会产生“Invalid format string”错误,阻止您登录。要修复此错误,请打开 models.py 文件并替换此代码块
token = jwt.encode({
'id': self.pk,
'exp': int(dt.strftime('%s'))
}, settings.SECRET_KEY, algorithm='HS256')
用这个
token = jwt.encode({
'id': self.pk,
'exp': dt.utcfromtimestamp(dt.timestamp())
}, settings.SECRET_KEY, algorithm='HS256')
现在,我们可以通过向 API 发送 HTTP 请求来创建用户、文章和评论,从而填充我们的 PostgreSQL 博客数据库。幸运的是,我们可以使用 Postman 发送一组 HTTP 请求,从而自动化填充过程。
首先,下载 Conduit.postman_collection.json 并将其保存到本地文件系统。然后打开 Postman,单击“File”菜单,单击“Import”子菜单,然后单击“Upload File”。选择本地存储库文件夹中的 Conduit.postman_collection.json 文件,然后单击“Import”。
接下来,单击右上角的眼睛图标(“环境快速查看”),然后单击“Add New Environment”。
现在,将环境命名为“Conduit”。然后,为环境提供以下变量和初始值
变量 | 初始值 |
APIURL | http://127.0.0.1:8000/api |
用户名 | alice_smith |
电子邮件 | alice@smith.com |
密码 | 1234!@#$ |
接下来,单击“Save”以保存并关闭 Conduit 环境。
现在,单击右上角的“No Environment”字段并将其更改为“Conduit”环境。
在左侧面板中,选择 Conduit 集合。单击右箭头,然后单击“Run”。
新窗口现在显示 Postman 集合运行器。在左侧面板的底部,单击“Run Conduit”按钮。
现在,回到 PostgreSQL CLI 终端。使用此命令连接到 conduit_db 数据库
> psql -U postgres -h localhost conduit_db
接下来,输入 SQL 命令以从您刚刚创建的文章中获取 ID、slug 和标题
conduit_db=# select id, slug, title from articles_article;
结果应与此匹配
id | slug | title
----+-------------------------------------+------------------------------
1 | welcome-to-realworld-project-dgroov | Welcome to RealWorld project
2 | explore-implementations-h9h4zn | Explore implementations
3 | create-a-new-implementation-ukwcnm | Create a new implementation
(3 rows)
现在,输入 SQL 命令以从我们刚刚插入的评论中获取 ID 和正文
conduit_db=# select id, body from articles_comment;
最后,您应该有这些结果
id | body
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | While most 'todo' demos provide an excellent cursory glance at a framework's capabilities, they typically don't convey the knowledge & perspective required to actually build real applications with it. 2 | RealWorld solves this by allowing you to choose any frontend (React, Angular, & more) and any backend (Node, Django, & more) and see how they power a real-world, beautifully designed full-stack app called Conduit.
3 | There are 3 categories: Frontend, Backend and FullStack
4 | Before starting a new implementation, please check if there is any work in progress for the stack you want to work on.
5 | If someone else has started working on an implementation, consider jumping in and helping them! by contacting the author.
(5 rows)
奖励:同时运行前端和后端
本节并非强制性,但如果您对完整的 Conduit 应用程序的外观感到好奇,那么它值得一读。这里的想法是让前端 Web 应用程序与我们的 Django 后端应用程序并行运行,以便前端可以消费 API。
首先,打开 Visual Studio Code 的另一个实例。然后,克隆或下载 vue-realworld-example-app 存储库并按照该页面上的说明使项目启动并运行。
现在,我们需要修改后端应用程序以供前端消费。前端应用程序将运行在 _https://:8080_ 上,因此我们需要允许两个应用程序之间的跨域通信。
因此,打开 Django 应用程序中的 _settings.py_ 文件并将 `localhost:8080` 添加到 `CORS_ORIGIN_WHITELIST` 常量中
CORS_ORIGIN_WHITELIST = (
'0.0.0.0:4000',
'localhost:4000',
'localhost:8080'
)
接下来,使用此命令重新运行 Django 应用程序
> python manage.py runserver
然后,切换到另一个 VS Code 实例以运行 Vue 前端应用程序
> npm run serve
新的前端应用程序现在应该在 _https://:8080_ 上运行。
如截图所示,我们用 Postman 填充的数据现在可见,并且前端应用程序与我们的 Django 和 PostgreSQL 后端项目无缝协作。
后续步骤
到目前为止,我们已经建立了一个后端项目,作为我们端到端现代化系列的起点。然后,我们使用 Postman 测试并使用初始示例数据填充 API。
本系列的目标是将应用程序及其当前数据迁移到 Azure,将其功能迁移到云原生服务,并将数据移植到 Cosmos DB。我们的下一篇文章将演示如何设置 Azure PostgreSQL 数据库,将应用程序数据迁移到 Azure,并确保应用程序仍然正常工作。最后,我们将展示应用程序在本地运行,同时连接到 Azure Postgres 数据库而不是本地数据库。
继续阅读第二篇文章,了解如何将数据迁移到云。
要了解有关 Visual Studio Code 的更多信息,以便将容器镜像从容器注册表部署到 Azure App Service,请查看我们的教程:使用 Visual Studio Code 将 Docker 容器部署到 Azure App Service。