目录
在这里,我们学习如何下载和运行基于Python、Django REST框架(DRF)和SQLite数据库的RealWorld示例应用程序,以提供后端REST API。我们准备好需求,然后在本地安装和运行PostgreSQL数据库。
许多Python开发团队知道他们需要对其应用程序进行现代化改造,但不确定从哪里开始、如何做或使用什么工具。
这个由六部分组成的文章系列将演示如何在Azure上实现Python应用程序和数据的现代化。我们将从以Django RealWorld Example App为代表的传统单体Python应用程序开始。
Django是一个成熟的、功能齐全的Python应用程序Web框架。然而,对于较小的项目来说,Django可能有点过分了,因为它鼓励开发大型的单体应用程序。开发人员经常考虑其他用于微服务的Python Web框架。
假设您的组织希望在不放弃您已经投入应用程序的工作的情况下逐渐远离Django。在这种情况下,Azure可以帮助顺利过渡到云原生微服务。
第一篇文章将在本地运行后端Django RealWorld应用程序,并进行一些小的更改以将SQLite替换为PostgreSQL数据库。您可以按照本文中的步骤运行您的应用程序,或下载并打开此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文件夹添加到系统的路径中。例如,在我的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 database:
postgres=# create database conduit_db;
CREATE DATABASE
最后,创建一个新的管道用户来连接到您的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添加以下依赖项,psycopg2是Python编程语言的PostgreSQL数据库适配器:
psycopg2==2.7.5
psycopg2-binary==2.7.5
在本地运行真实世界的应用程序
在运行应用程序之前,让我们创建一个与系统目录隔离的虚拟环境。这样,我们就可以为我们的新项目独立安装一组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以确认后端工作正常:
使用示例数据填充应用程序
不幸的是,当前代码给出了“无效格式字符串”错误,阻止您登录。要修复此错误,请打开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。
接下来,单击右上角的眼睛图标(“环境快速查看”),然后单击添加新环境。
现在,将环境命名为“Conduit”。然后,为环境提供以下变量和初始值:
变量 | 初始值 |
APIURL | http://127.0.0.1:8000/api |
用户名 | alice_smith |
电子邮件 | alice@smith.com |
密码 | 1234!@#$ |
接下来,单击Save以保存并关闭Conduit环境。
现在,单击右上角的No Environment字段并将其更改为“Conduit”环境。
在左侧面板上,选择Conduit集合。单击右箭头,然后单击运行。
一个新窗口现在显示Postman Collection Runner。在左侧面板的底部,单击Run Conduit按钮。
现在,回到PostgreSQL CLI终端。使用以下命令连接到管道数据库数据库:
> 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应用程序的外观感到好奇,那么它是值得的。这里的想法是与我们的Django后端应用程序并行运行一个前端Web应用程序,以便前端可以使用API。
首先,打开另一个Visual Studio Code实例。然后,克隆或下载vue-realworld-example-app存储库并按照该页面上的说明启动并运行项目。
现在,我们需要修改后端应用程序以供前端使用。前端应用程序将在http://localhost: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
新的前端应用程序现在应该在http://localhost:8080运行。
如屏幕截图所示,我们使用Postman填充的数据现在可见,并且前端应用程序与我们的Django和PostgreSQL后端项目无缝协作。
下一步
到目前为止,我们已经建立了一个后端项目,作为我们端到端现代化系列的起点。然后,我们使用Postman测试并使用初始样本数据填充API。
本系列旨在将应用程序及其当前数据迁移到Azure,将其功能迁移到云原生服务,并将数据移植到Cosmos DB。我们的下一篇文章演示了如何设置Azure PostgreSQL数据库,将应用程序的数据迁移到Azure,并确保应用程序仍然有效。最后,我们将展示应用程序在连接到Azure Postgres数据库而不是本地数据库时在本地运行。
继续第二篇了解如何将数据迁移到云端。
若要详细了解Visual Studio Code以将容器映像从容器注册表部署到Azure应用服务,请查看我们的教程,使用Visual Studio Code将Docker容器部署到Azure应用服务。
https://www.codeproject.com/Articles/5326410/Modernizing-Python-Apps-and-Data-on-Azure-Part-1