作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Arjaan Buijk的头像

Arjaan Buijk

Arjaan是一名高级工程师和数据科学家,负责创建关键任务, 基于python的云解决方案专注于面向国际银行和保险公司的Rasa. 他设计并教授大规模Kubernetes解决方案.

Previously At

Rasa
Share

这是关于在基于django的项目中利用pydantic的系列文章的第三部分. Before we continue, 让我们回顾一下:在本系列的第一部分中, 我们主要讨论pydantic对Python类型提示的使用 简化Django设置管理. 在第二篇教程中,我们使用Docker来构建基于这个概念的web应用程序, 调整我们的开发和生产环境.

部署源代码——以及在更新后重新部署——可能是一个令人沮丧的过程,让您心碎. 在与其他部署平台建立了如此多的不良关系之后, 我很幸运能和Django和Heroku找到长久的幸福. 我想通过一个精心挑选的例子来分享我成功的秘诀.

We want to deploy our Django 应用程序,并确保默认情况下它是简单和安全的. Heroku通过结合效率和安全性,为我们的应用平台提供了一个无压力的关系.

我们已经做了一个样品 hello-visitor application in part 2 在Django和pydantic系列教程中,我们讨论了我们的开发环境应该如何使用pydantic反映我们的生产环境. 这种镜像从我们的项目中移除了相当大的风险.

剩下的任务是使我们的应用程序可以在web上使用 Heroku. 注意:为了完成本教程,您必须在Heroku注册一个基本计划帐户.

Heroku Overview

Heroku is a 平台即服务,它服务于应用程序. 这些应用程序,称为应用程序,将我们的系统需求和源代码结合起来. 把我们的应用放到Heroku身上, 我们必须创建一个Heroku模块—一个结合了我们的配置的应用程序映像, add-ons, 更重要的是创建一个可部署的版本. Heroku slugs are 与Docker镜像相媲美.

Heroku 通过以下步骤完成精心安排的流程:

  • Build step:
    • Heroku检查我们的应用程序源并确定需要哪些技术.
    • 为我们的应用程序构建所需的基本系统映像 buildpack,在这种情况下是 heroku/python.
    • 生成的图像在Heroku语中被称为鼻涕虫.
  • Release step:
    • Heroku允许我们进行预部署工作或对系统执行各种检查, settings, or data.
    • 在此步骤中,数据库迁移很常见.
  • Runtime step:
    • Heroku将我们的图像旋转到称为dynos的轻量级容器中,并将它们连接到我们的 add-on services, e.g., a database.
    • 一个或多个动态系统构成了我们的系统基础结构,包括必需的 routers 启用内部动态通信.
    • 传入的HTTP请求也属于路由器的职责范围, 其中流量链接到适当的web服务器动态服务器。.
    • 向外扩展很简单,因为Heroku允许基于负载动态配置动态服务器.

现在我们了解了Heroku是如何工作的以及它的基本术语, 我们将展示部署示例应用程序是多么简单.

Install Heroku CLI

我们需要Heroku的命令行界面 installed locally. 使用标准的snap安装使其变得简单—我们将在Ubuntu开发机器上演示这一点. Heroku文档提供了在其他平台上安装其工具集的附加步骤.

Sudo snap install——经典的英雄主义
​
#检查它是否有效
heroku --version

我们必须使用我们的凭据通过 authentication step:

heroku login

这将保存我们的电子邮件地址和API令牌到 ~/.netrc file for future use.

Create Heroku App

有了Heroku, creating our app 这是部署源代码的第一步吗. 这个应用程序不仅指向我们的源代码存储库,而且还列举了我们需要的附加组件.

关于Heroku部署的一个关键注意事项是,每个应用程序必须为使用Heroku的每个人拥有一个唯一的名称. 因此,在执行这些步骤时不能使用单个示例名称. 请选择一个让您满意的名称,并将其插入本教程的指令块中. 我们的截图将列出应用程序名称为 hello-visitor,但当您继续操作时,您唯一选择的名称将出现在这些位置.

我们使用基本的Heroku脚手架命令来创建我们的应用:

heroku apps:create 

The PostgreSQL Add-on

我们的应用程序需要Django项目的关系数据库,如 part 2 of our series. 我们通过Heroku浏览器界面配置所需的附加组件,步骤如下:

  1. 导航到Heroku仪表板中的Resources选项卡来配置附加组件.
  2. 让Heroku安装Postgres heroku-postgresql.
    1. 选择Mini附加计划.
  3. 将此附加组件与我们唯一命名的应用程序关联.
  4. 点击提交订单.

一个名为Online Order Form的Heroku管理页面显示,Postgres被选为hello-visitor应用程序的附加组件. 这个数据库是在Heroku Mini计划下添加的,从下拉菜单中选择. 底部有一个紫色的Submit Order Form按钮.
Online Order Form

Once PostgreSQL 已经配置并关联到我们的应用程序, 我们可以在应用程序的配置变量中看到数据库连接字符串. To demonstrate this, 我们导航到设置,点击显示配置变量, 我们在哪里看到一个变量 DATABASE_URL:

DATABASE_URL = postgres: / / {user}:{密码}@{主机名}:{港口}/{数据库名称}

如本系列的第1部分和第2部分所述, 我们的应用程序中固有的强大功能来自于 pydantic and 环境变量. Heroku使其配置变量在应用程序环境中自动可用, 这意味着我们的代码不需要在生产环境中进行任何更改. 我们不会详细探讨每个设置,而是将其作为练习留给您.

配置应用程序管道

当我们在上面介绍Heroku时, 我们详细介绍了其管道中需要创建的关键步骤, configure, and deploy an app. 每个步骤都有包含适当设置和命令的相关文件.

配置构建步骤

我们得告诉Heroku该用哪种技术. 我们的应用程序使用Python和一组必需的依赖项,如 its requirements.txt file. 如果我们希望应用程序使用最新的Python版本(目前默认为版本3).10.4) Heroku不需要我们明确地确定构建步骤使用哪个Python版本. 因此,我们现在将跳过显式构建配置.

配置释放步骤

Heroku的发布步骤是在部署前完成的,在我们的应用程序中有一个指定的相关命令 hello-visitor / Procfile. 我们遵循最佳实践,创建一个单独的shell命令,列出我们想要运行的命令或依赖脚本. 赫鲁库总是会读的 hello-visitor / Procfile 文件并执行其内容.

我们在这个文件中还没有一个脚本可以引用,所以让我们创建我们的发布shell脚本, hello-visitor / heroku-release.sh, and ask Heroku to secure 我们的部署和执行数据库迁移自动使用以下文本:

# file: hello-visitor / heroku-release.sh
cd src
python manage.py check——deploy——fail-level警告
python manage.py migrate

对于任何用户创建的shell脚本,我们必须确保它是可执行的. 下面的命令使我们的脚本在Unix发行版上可执行:

Chmod +x heroku-release.sh

现在我们已经编写了发布脚本,将其添加到应用程序中 hello-visitor / Procfile 文件,以便在发布期间运行. We create the Procfile 并增加以下内容:

# file: hello-visitor / Procfile
release: ./heroku-release.sh

在我们可以进行测试部署之前,完全配置的发布步骤只留下部署步骤定义.

配置部署步骤

我们将配置我们的应用来启动一个带有两个工作节点的web服务器.

正如我们在发布部分所做的那样, 我们将遵循最佳实践,创建一个包含部署操作的独立shell脚本. 我们将调用这个部署脚本 heroku-web.sh 然后在我们的项目根目录中创建它,包含以下内容:

# file: hello-visitor/heroku-web.sh
cd src
gunicorn hello_visitor.Wsgi——工人2——日志文件

我们通过使用以下命令更改其系统标志来确保脚本是可执行的:

chmod +x heroku-web.sh

现在我们已经创建了可执行的部署脚本,接下来更新我们的应用程序 Procfile 以便部署步骤在适当的阶段运行:

# file: hello-visitor / Procfile
release: ./heroku-release.sh
web: ./heroku-web.sh

Our Heroku app pipeline is now defined. 下一步是准备源代码使用的环境变量,因为这是按照Heroku应用程序定义屏幕的顺序进行的. 如果没有这些环境变量,我们的部署将会失败,因为我们的源代码依赖于它们.

Environment Variables

Django需要一个秘钥, SECRET_KEY,才能正确操作. 这个密钥将被存储, 还有其他变量, 在应用程序的相关环境变量集合中. 在完全配置环境变量之前,让我们先生成秘钥. 我们必须通过使用base64(而不是UTF-8)编码来确保该密钥中没有特殊字符。. Base64不包含非字母数字字符(如.g., +, @),当秘密作为环境变量提供时可能会导致意想不到的结果. Generate the SECRET_KEY 使用以下Unix命令:

Openssl rand -base64 70

有了这个键,我们现在可以将环境变量配置为Heroku的配置变量.

前面,我们查看了Config Vars管理面板中的数据库连接字符串. 现在我们必须导航到这个管理面板来添加变量和特定的值:

Key

Value

ALLOWED_HOSTS

["hello-visitor.herokuapp.com"]

SECRET_KEY

(使用生成的键值)

DEBUG

False

DEBUG_TEMPLATES

False

At this point, 我们的Heroku应用程序已经配置了部署管道中的所有步骤,并设置了环境变量. 最后一个配置步骤是将Heroku指向我们的源代码存储库.

GitHub Repository

Now we ask Heroku to 将我们的应用程序与我们的GitHub存储库关联 使用说明如下:

  1. 导航到Heroku仪表板中的Deploy选项卡.
  2. 用GitHub验证我们的Heroku账户(只做一次).
  3. 导航到我们的Heroku应用程序的管理面板.
  4. 在部署方法下拉列表中,选择GitHub. 然后,Heroku将在我们的GitHub帐户中显示可用项目列表.
  5. 我们选择GitHub存储库.
  6. Heroku连接到GitHub存储库.

之后,我们的仪表板应该如下所示:

将显示Heroku的管理部署选项卡. 在顶部,GitHub显示为已连接. At the bottom, GitHub存储库“ArjaanBuijk/hello-visitor”显示为由用户“ArjaanBuijk”连接。. 在此信息的右侧有一个红色的“断开”按钮.
Heroku’s Deploy Tab

现在,我们可以通过导航到手动部署部分来手动部署我们的应用, 选择我们的存储库 main 分支,并单击Deploy branch按钮.

Heroku管理部署面板显示了Django应用程序部署的存储库分支,在“输入要部署的分支的名称”下面选择了“main”.“在右下方有一个黑色按钮,标签为部署分支.
Heroku Deployment

If all goes well, 我们的部署将正确完成使用我们定义的构建和发布脚本和部署网站.

A Test Run

我们可以通过单击Heroku App仪表板顶部的Open App按钮来尝试部署的应用程序.

该网页将显示网站访问者的数量,每次刷新页面都会增加.

更流畅的Django应用部署

在我看来,这次部署再容易不过了. 配置步骤并不繁琐, 以及Heroku的核心构建包, 被Heroku平台亲切地呵护着, 几乎所有繁重的工作都要做吗. Better yet, the core Heroku Python构建包 它是开源的,并且许多其他应用程序平台都使用它吗. 因此,您在本教程中学到的方法是一种高度可转移的技能.

当我们将部署与镜像环境和动态设置管理的魔力结合在一起时, we have a stable, 独立于环境的部署,可在本地和web上工作.

遵循这种Django设置管理方法,你会得到 a single settings.py 它使用环境变量对自身进行配置.


Toptal Engineering博客向 Stephen Davidson 为了检查和测试本文中提供的代码示例.

了解基本知识

  • Heroku是用来做什么的?

    Heroku是一个基于云的平台,托管用流行语言编写的应用程序,包括Python.

  • Why is Heroku popular?

    Heroku为开发人员简化了托管和部署, 甚至可以链接到源代码存储库,以实现轻松的重新部署.

  • 部署Django应用程序的最佳方式是什么?

    Heroku和它的Python构建包使部署变得轻松. Additionally, 同样的构建包允许其他部署平台使用许多相同的Django托管和部署特性.

就这一主题咨询作者或专家.
Schedule a call
Arjaan Buijk的头像
Arjaan Buijk

Located in 普利茅斯,密歇根州,美国

Member since June 4, 2018

About the author

Arjaan是一名高级工程师和数据科学家,负责创建关键任务, 基于python的云解决方案专注于面向国际银行和保险公司的Rasa. 他设计并教授大规模Kubernetes解决方案.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Rasa

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.