在 Heroku 上托管 Django 项目

举报
Yuchuan 发表于 2021/10/13 16:36:21 2021/10/13
【摘要】 现在,您知道如何将您的想法转化为您的朋友和家人会喜欢的实时 Web 应用程序。也许,人力资源部门的某个人可能会偶然发现您的一个项目并为您提供工作。注册一个免费的 Heroku 帐户来托管您的 Django 代码是进入云计算世界的最佳方式之一。

目录

作为Web 开发新手,您已经构建了自己的投资组合应用程序并在GitHub 上共享了您的代码。也许,您希望吸引技术招聘人员找到您的第一份编程工作。许多编码训练营的毕业生可能都在做同样的事情。为了让自己从人群中脱颖而出并增加获得关注的机会,您可以开始在线托管您的 Django 项目。

对于业余爱好 Django 项目,您需要免费快速设置、用户友好且与现有技术堆栈良好集成的托管服务。虽然GitHub Pages非常适合托管静态网站和使用JavaScript 的网站,但您需要一个网络服务器来运行您的FlaskDjango项目。

有几个主要的云平台提供商以不同的模型运行,但您将在本教程中探索Heroku。它符合所有条件——免费、快速设置、用户友好且与 Django 良好集成——并且是许多初创公司最喜欢的云平台提供商。

在本教程中,您将学习如何:

  • 在几分钟内让您的Django项目上线
  • 使用Git将您的项目部署到 Heroku
  • 使用Django-Heroku集成库
  • 将你的 Django 项目连接到一个独立的关系数据库
  • 管理配置以及敏感数据

要继续,您可以通过单击下面的链接下载代码和其他资源:

演示:您将构建的内容

您将创建一个基本的 Django 项目,并直接从终端将其部署到云中。最后,您将拥有一个指向您的第一个 Heroku 应用程序的公开且可共享的链接。

这是一个一分钟的视频,演示了必要的步骤,从初始化一个空的 Git 存储库到在浏览器中查看您完成的项目。坚持观看直到最后,快速预览您将在本教程中找到的内容:

项目概况

本教程不是关于构建任何特定项目,而是使用Heroku在云中托管一个项目。虽然 Heroku 支持各种语言和 Web 框架,但您将坚持使用 Python 和 Django。如果您手头没有任何 Django 项目,请不要担心。第一步将引导您搭建一个新的 Django 项目,以帮助您快速入门。或者,您可以使用稍后会找到的现成示例项目。

准备好 Django 项目后,您将注册一个免费的 Heroku 帐户。接下来,您将下载一个方便的命令行工具,帮助您在线管理您的应用程序。如上面的截屏视频所示,命令行是使用 Heroku 的一种快捷方式。最后,您将在新配置的 Heroku 实例上托管已部署的 Django 项目。您可以将最终结果视为未来项目创意的占位符。

先决条件

在继续之前,请确保您熟悉Django Web 框架的基础知识,并且您可以轻松地使用它来设置基本项目。

注意:如果您对 Flask 的经验比 Django 更有经验,那么您可以查看关于使用 Heroku 部署 Python Flask 示例应用程序的类似教程。

您还应该安装并配置一个Git客户端,以便您可以从命令行方便地与 Heroku 平台交互。最后,您应该认真考虑为您的项目使用虚拟环境。如果您还没有想到特定的虚拟环境工具,您很快就会在本教程中找到一些选项。

第 1 步:搭建一个用于托管的 Django 项目

要在云中托管 Django Web 应用程序,您需要一个有效的Django 项目。就本教程而言,不必详细说明。如果时间不够,请随意使用您的业余爱好项目之一或构建示例投资组合应用程序,然后跳到创建本地 Git 存储库。否则,坚持从头开始制作一个全新的项目。

创建虚拟环境

通过创建一个不会与其他项目共享的隔离虚拟环境来开始每个项目是一个好习惯。这可以使您的依赖项井井有条,并有助于避免包版本冲突。一些依赖管理器和打包工具(如Pipenv诗歌)会自动创建和管理虚拟环境,以便您遵循最佳实践。当您开始一个新项目时,许多IDE(PyCharm)默认也会这样做。

但是,创建 Python 虚拟环境最可靠和可移植的方法是从命令行手动创建。可以使用virtualenvwrapper等外部工具,也可以直接调用内置venv模块。虽然 virtualenvwrapper 将所有环境保存在预定义的父文件夹中,但venv希望您分别为每个环境指定一个文件夹。

您将venv在本教程中使用标准模块。习惯上把虚拟环境放在项目根文件夹下,所以我们先做一个,把工作目录改成它:

$ mkdir portfolio-project
$ cd portfolio-project/

您现在位于portfolio-project文件夹中,该文件夹将成为您的项目的主目录。要在此处创建虚拟环境,只需运行该venv模块并为您的新环境提供路径。默认情况下,文件夹名称将成为环境名称。如果你愿意,你可以使用可选--prompt参数给它一个自定义名称:

$ python3 -m venv ./venv --prompt portfolio

.以前导点 ( )开头的路径表示它相对于当前工作目录。虽然不是强制性的,但这个点清楚地表明了你的意图。无论哪种方式,此命令都应venv在您的portfolio-project根目录中创建一个子目录:

portfolio-project/
│
└── venv/

这个新的子目录包含 Python 解释器的副本以及一些管理脚本。您现在已准备好将项目依赖项安装到其中。

安装项目依赖

大多数实际项目都依赖于外部库。Django 是第三方 Web 框架,并没有随附现成的 Python。您必须在项目的虚拟环境中安装它以及它自己的依赖项。

如果您还没有激活虚拟环境,请不要忘记激活。为此,您需要在虚拟环境的bin/子文件夹中可用的 shell 脚本之一中执行命令。例如,如果您使用Bash,则获取activate脚本:

$ source venv/bin/activate

shell提示符现在应该显示与您的虚拟环境的名称前缀来显示它的激活。您可以仔细检查特定命令指向的可执行文件:

(portfolio) $ which python
/home/jdoe/portfolio-project/venv/bin/python

以上输出确认运行python将执行位于您的虚拟环境中的相应文件。现在,让我们为您的 Django 项目安装依赖项

您需要一个相当新版本的 Django。根据您阅读本文的时间,可能会有更新的版本可用。为避免潜在的兼容性问题,您可能需要指定与编写本教程时使用的版本相同的版本:

(portfolio) $ python -m pip install django==3.2.5

这将安装 3.2.5 版本的 Django。包名称不区分大小写,因此例如键入django或都没有关系Django

注意:有时,您会看到有关新版本pip可用的警告。忽略此警告通常是无害的,但如果您在生产环境中,出于安全原因,您需要考虑升级:

(portfolio) $ python -m pip install --upgrade pip

或者,您可以在配置文件中禁用版本检查,如果它困扰您并且您知道可能的后果。

安装 Django 会带来一些额外的传递依赖项,您可以通过列出它们来显示:

(portfolio) $ python -m pip list
Package    Version
---------- -------
asgiref    3.4.1
Django     3.2.5
pip        21.1.3
pytz       2021.1
setuptools 56.0.0
sqlparse   0.4.1

由于您希望其他人能够毫无问题地下载和运行您的代码,因此您需要确保可重复构建。这就是冷冻的目的。它以特殊格式输出大致相同的一组依赖项及其子依赖项:

(portfolio) $ python -m pip freeze
asgiref==3.4.1
Django==3.2.5
pytz==2021.1
sqlparse==0.4.1

这些本质上是pip install命令的参数。但是,它们通常封装在一个或多个可以一次性使用的需求文件pip。要创建这样的文件,您可以重定向freeze命令的输出:

(portfolio) $ python -m pip freeze > requirements.txt

此文件应提交到您的 Git 存储库,以便其他人可以通过pip以下方式安装其内容:

(portfolio) $ python -m pip install -r requirements.txt

目前,您唯一的依赖项是 Django 及其子依赖项。但是,您必须记住在每次添加或删除任何依赖项时重新生成和提交需求文件。这是前面提到的包管理器可能派上用场的地方。

有了这些,让我们开始一个新的 Django 项目!

引导一个 Django 项目

每个 Django 项目都由遵循特定命名约定的类似文件和文件夹组成。您可以手动创建这些文件和文件夹,但以自动方式进行通常更快、更方便。

安装 Django 时,它会为管理任务(例如引导新项目)提供命令行实用程序。该工具位于您的虚拟环境的bin/子文件夹中:

(portfolio) $ which django-admin
/home/jdoe/portfolio-project/venv/bin/django-admin

您可以在 shell 中运行它并传递新项目的名称以及它将创建默认文件和文件夹的目标目录:

(portfolio) $ django-admin startproject portfolio .

或者,您可以通过调用django模块来获得相同的结果:

(portfolio) $ python -m django startproject portfolio .

请注意这两个命令末尾的点,它表示您当前的工作目录portfolio-project,作为目标。如果没有它,该命令将创建另一个与您的项目同名的父文件夹。

如果您收到command not found错误或ModuleNotFound 异常,请确保您已激活安装 Django 的相同虚拟环境。其他一些常见错误是将您的项目命名为与内置对象之一相同或未使用有效的 Python 标识符。

注意:使用管理工具从头开始一个新的 Django 项目既快速又灵活,但需要大量的体力劳动。如果您计划托管生产级 Web 应用程序,则需要配置安全性、数据源等。选择遵循最佳实践的项目模板可能会为您省去一些麻烦。

之后,你应该有这个目录布局:

portfolio-project/
│
├── portfolio/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── venv/
│
├── manage.py
└── requirements.txt

您创建了一个名为的管理应用程序portfolio,其中包含项目级设置和带有 URL 模式的主文件,以及其他一些内容。您还创建了manage.py可以方便地包装django-admin和连接到您的项目的脚本。

您现在拥有一个基本但可运行的 Django 项目。此时,您通常会启动一个或多个Django 应用程序并定义它们的视图和模型,但本教程不需要它们。

更新本地数据库架构(可选)

此步骤是可选的,但如果您想使用Django 管理视图或定义自定义应用程序和模型,那么您最终需要更新您的数据库架构。默认情况下,Django 带来了一个基于文件的SQLite 数据库,方便测试和运行本地开发服务器。这样,您无需安装和设置像MySQLPostgreSQL这样的成熟数据库。

要更新数据库架构,请运行migrate子命令:

(portfolio) $ python manage.py migrate

成功应用所有挂起的迁移后,您将db.sqlite3在项目根文件夹中找到一个名为的新文件:

portfolio-project/
│
├── portfolio/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── venv/
│
├── db.sqlite3
├── manage.py
└── requirements.txt

您可以使用sqlite3命令行实用程序、Python 的内置sqlite3模块或您喜欢的数据库管理工具检查其内容。到现在为止,这个文件应该包含一些负责身份验证、会话管理等的内部应用程序的表,以及一个用于跟踪应用迁移的元表。

运行本地开发服务器

在通过将 Heroku 放在项目之上来增加复杂性之前,在本地计算机上测试所有内容是有意义的。这可能会让您免去很多不必要的调试。幸运的是,Django 带有一个用于开发目的的轻量级 Web 服务器,它几乎不需要配置。

注意:从技术上讲,您可以利用 Heroku 上 Django 中内置的相同开发服务器。然而,它并不是为处理现实生活中的流量而设计的,也不安全。你最好使用像Gunicorn这样的WSGI服务器。

要运行开发服务器,请在之前激活虚拟环境的终端窗口中键入以下命令:

(portfolio) $ python manage.py runserver

默认情况下,它将在本地主机端口 8000上启动服务器。如果另一个应用程序已经在使用 8000,您可以调整端口号。服务器将持续监视项目源文件中的更改,并在必要时自动重新加载它们。当服务器仍在运行时,导航到 Web 浏览器中的 URL:

http://127.0.0.1:8000/

主机127.0.0.1代表虚拟本地网络接口上的IP 地址之一。如果一切顺利并且您没有更改默认项目设置,那么您应该登陆 Django 欢迎页面:

本地主机上的 Django 欢迎页面

万岁!火箭已起飞,您的 Django 项目已准备好在云中部署。

步骤 2:创建本地 Git 存储库

既然您已经有了一个可以运行的 Django 项目,那么下一步是将它托管在云中。在本节中,您将探索在 Heroku 平台上构建和部署应用程序的可用选项。如果您还没有为您的项目创建本地 Git 存储库,您还将创建该存储库。在这一步结束时,您将准备好深入研究 Heroku 工具链。

Heroku 至少提供了五种不同的方式来部署您的项目:

  1. Git:推送提交到 Heroku 上的远程 Git 存储库
  2. GitHub:合并拉取请求时自动触发部署
  3. Docker:将Docker镜像推送到 Heroku 容器注册表
  4. API:以编程方式自动化部署
  5. Web:从 Heroku 仪表板手动部署

最直接且以开发人员为中心的方法是第一种方法。许多软件开发人员每天都在使用 Git,因此 Heroku 的入门门槛非常低。该git命令可让您在 Heroku 中完成很多工作,这就是您将在本教程中使用 Git 的原因。

初始化一个空的 Git 存储库

使用组合键Ctrl+CCmd+C停止开发服务器或打开另一个终端窗口,然后在项目根文件夹中初始化本地 Git 存储库:

$ git init

无论您的虚拟环境是否处于活动状态,这都无关紧要。它应该创建一个新的.git子文件夹,其中将包含 Git 跟踪的文件的历史记录。名称以点开头的文件夹在 macOS 和 Linux 上是隐藏的。如果要检查是否创建成功,则使用ls -a命令查看此文件夹。

指定未跟踪的文件

告诉 Git 忽略哪些文件以便它不再跟踪它们是很有用的。某些文件不应该是存储库的一部分。您通常应该忽略IDE 和代码编辑器设置、包含密码等敏感数据的配置文件、Python 虚拟环境等二进制文件、缓存文件以及 SQLite 数据库等数据。

当您检查新 Git 存储库的当前状态时,它将列出工作目录中存在的所有文件,并建议将它们添加到存储库中:

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    .idea/
    __pycache__/
    db.sqlite3
    manage.py
    portfolio/
    requirements.txt
    venv/

nothing added to commit but untracked files present (use "git add" to track)

与其添加所有这些文件和文件夹,不如让 Git 忽略其中的一些,例如:

  • .idea/
  • __pycache__/
  • db.sqlite3
  • venv/

.idea/文件夹特定于 PyCharm。如果您使用的是Visual Studio Code或其他编辑器,则需要将其相应的文件和文件夹添加到此列表中。预先包含更多文件名模式将使其他贡献者安全地使用他们选择的编辑器和 IDE,而不必过于频繁地更新列表。

Git 会查找一个名为 的特殊文件.gitignore,该文件通常位于存储库的根文件夹中。每行都包含要排除的具体文件名或通用文件名模式。您可以手动编辑此文件,但使用gitignore.io网站从一组预定义的组件中创建一个要快得多:

gitignore.io

您会注意到在地址栏中输入gitignore.io会将浏览器重定向到 Toptal 拥有的更详细的域。

在这里,您可以选择正在使用的编程语言、库和工具。如果您对选择感到满意,请单击“创建”按钮。然后,将结果复制并粘贴到文本编辑器并将其另存为.gitignore项目根文件夹中,或者记下 URL 并在命令行中使用cURL下载文件:

$ curl https://www.toptal.com/developers/gitignore/api/python,pycharm+all,django > .gitignore

如果你发现自己重复输入这个 URL,那么你可以考虑在你的 shell 中定义一个别名命令,这应该是最容易记住的:

$ git ignore python,pycharm+all,django > .gitignore

通常有多种方法可以实现相同的目标,了解不同的选项可以教你很多东西。无论哪种方式,创建.gitignore文件后,您的存储库状态应如下所示:

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    .gitignore
    manage.py
    portfolio/
    requirements.txt

nothing added to commit but untracked files present (use "git add" to track)

创建本地 Git 存储库的其余步骤是暂存您的更改并将其保存在您的第一次提交中。

进行第一次提交

请记住,要通过 Git 使用 Heroku,您必须将代码推送到远程 Git 存储库。为此,您需要在本地存储库中至少进行一次提交。首先,将新文件添加到暂存区,它是工作树和本地存储库之间的缓冲区。然后,重新检查状态以确认您没有遗漏任何内容:

$ git add .
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   .gitignore
    new file:   manage.py
    new file:   portfolio/__init__.py
    new file:   portfolio/asgi.py
    new file:   portfolio/settings.py
    new file:   portfolio/urls.py
    new file:   portfolio/wsgi.py
    new file:   requirements.txt

这些文件已准备好提交,所以让我们拍摄它们的快照并将它们保存在本地存储库中:

$ git commit -m "Initial commit"

提供描述性提交消息以帮助您浏览更改历史总是一个好主意。作为一个经验法则,你的消息应该解释为什么你所做的更改。毕竟,任何人都可以查看 Git 日志以准确了解发生了什么变化。

好的,那么到目前为止你学到了什么?您知道将新版本部署到 Heroku 平台通常涉及将您的本地提交推送到 Git 远程。您已经创建了一个本地 Git 存储库并进行了第一次提交。接下来,您需要创建您的免费 Heroku 帐户。

第 3 步:创建一个免费的 Heroku 帐户

此时,您已准备好注册一个免费的 Heroku 帐户并根据自己的喜好进行配置。

Django 将自己标榜为具有截止日期的完美主义者的 Web 框架。Heroku 采用类似的固执己见的方法在云中托管 Web 应用程序,旨在缩短开发时间。它是一种高级且安全的平台即服务 (PaaS)可减轻您肩上的基础设施管理负担,让您专注于对您最重要的事情——编写代码。

有趣的事实: Heroku 基于亚马逊网络服务 (AWS),这是另一个流行的云平台,主要以基础设施即服务 (IaaS)模型运行。它比 Heroku 灵活得多,价格也更便宜,但需要一定程度的专业知识。

许多初创公司和小公司在开发的早期阶段都没有熟练的 DevOps 工程师团队。就这些公司的投资回报而言,Heroku 可能是一个方便的解决方案。

报名

要开始使用 Heroku,请访问Heroku 注册页面,填写注册表,然后等待带有链接的电子邮件以确认您的帐户。它将带您进入密码设置页面。配置完成后,您将能够继续使用新的 Heroku 仪表板。您需要做的第一件事是阅读并接受服务条款。

启用多重身份验证(可选)

这一步完全是可选的,但 Heroku 可能会提醒您注册多重身份验证 (MFA),以加强对您帐户的保护并确保其安全。此功能也称为双因素身份验证(2FA),因为它通常只包含两个阶段来验证您的身份。

有趣的事实:我的个人 Netflix 帐户曾一度被黑,有人可以使用我的信用卡,即使在我取消订阅很久之后也是如此。从那时起,我在所有在线服务中启用了双因素身份验证。

登录到您的 Heroku 仪表板后,单击右上角的忍者头像,选择“帐户设置”,然后向下滚动,直到您可以看到“多重身份验证”部分。单击标有“设置多重身份验证”的按钮并选择您的验证方法:

  • Salesforce 身份验证器
  • 一次性密码生成器
  • 安全密钥
  • 内置身份验证器
  • 恢复代码

您应该选择这些验证方法中的哪一种?

Salesforce是 2010 年收购 Heroku 的母公司,这就是为什么他们将其专有移动应用程序作为您的首选。但是,如果您已经在其他地方使用其他身份验证器应用程序,请选择一次性密码生成器选项并使用您的应用程序扫描二维码。

安全密钥需要外部硬件USB令牌,而内置的身份验证方法,可以利用设备的指纹识别器,例如,如果它带有一个。

最后,恢复代码可以用作附加密码。即使您只打算在手机上使用身份验证器应用程序,也应该下载恢复代码作为备份。如果没有其他方法来验证您的身份,如果您丢失、损坏或升级您的手机,您将无法再次登录您的 Heroku 帐户。相信我,我去过那里!

Heroku 曾经通过发送到您手机的 SMS 提供另一种验证方法,但由于安全问题,他们停止了该方法。

添加付款方式(可选)

如果您不愿意与 Heroku 分享您的信用卡号,那也没关系。该服务将继续免费运行,但有合理的限制。然而,即使您不打算花一分钱在云中托管您的 Django 项目,您仍然可以考虑连接您的付款详细信息。这是为什么。

在撰写本教程时,免费帐户每月只能使用 550 小时。这大约是每天 24 小时使用单个计算机实例的 22 天。当您使用信用卡验证您的帐户时,该池会攀升至每月 1,000 小时的免费小时数。

注意:无论您是否验证您的帐户,在 30 分钟窗口内未收到任何 HTTP 流量的免费层级 Web 应用程序都会自动进入休眠状态。这可以节省您的空闲时间,但如果您的应用没有获得正常流量,则可能会使用户体验变得更糟。当有人想在待机模式下使用您的 Web 应用程序时,需要几秒钟才能再次启动。

验证您的帐户的其他好处包括使用免费附加组件(例如关系数据库)、设置自定义域等的可能性。请记住,如果您决定与 Heroku 共享您的帐单信息,那么启用多因素身份验证是一项值得的练习。

到目前为止,您已经通过他们的 Web 界面与 Heroku 进行了交互。虽然这无疑是方便和直观的,但在线托管 Django 项目的最快方法是使用命令行。

第 4 步:安装 Heroku CLI

在终端中工作是任何开发人员的基本技能。键入命令起初可能看起来令人生畏,但在看到它的强大功能后,它就变成了第二天性。为了获得无缝的开发人员体验,您需要安装Heroku 命令行界面 (CLI)

Heroku CLI 可让您直接从终端创建和管理您的 Web 应用程序。在这一步中,您将学习一些基本命令以及如何显示它们的文档。首先,按照您的操作系统的安装说明进行操作。完成后,使用以下命令确认安装成功:

$ heroku --version

如果heroku找到该命令并且您使用的是最新版本的 Heroku CLI,则可以在 shell 中启用自动完成功能。当您按下Tab键时,它会自动完成命令及其参数,从而节省时间并防止输入错误。

注意:该工具需要一个Node.js服务器,大多数安装方法都捆绑了它。它也是一个开源项目,这意味着您可以在 GitHub 上查看其源代码

Heroku CLI 具有模块化插件架构,这意味着其功能是自包含的并遵循相同的模式。要获取所有可用命令的列表,请在终端中输入heroku help或简单地heroku输入:

$ heroku
CLI to interact with Heroku

VERSION
  heroku/7.56.0 linux-x64 node-v12.21.0

USAGE
  $ heroku [COMMAND]

COMMANDS
  access          manage user access to apps
  addons          tools and services for developing, extending, (...)
  apps            manage apps on Heroku
  auth            check 2fa status
(...)

有时,命令的名称可能不会泄露它的作用。如果您想了解有关特定命令的更多详细信息并查看使用的快速示例(如果可用),请使用以下--help标志:

$ heroku auth --help
check 2fa status

USAGE
  $ heroku auth:COMMAND

COMMANDS
  auth:2fa     check 2fa status
  auth:login   login with your Heroku credentials
  auth:logout  clears local login credentials and invalidates API session
  auth:token   outputs current CLI authentication token.
  auth:whoami  display the current logged in user

在这里,您auth通过使用--help标志来询问有关命令的更多信息。您可以看到auth后面应该跟一个冒号 ( :) 和另一个命令。通过键入heroku auth:2fa,您是在要求 Heroku CLI 检查您的双因素身份验证设置的状态:

$ heroku auth:2fa --help
check 2fa status

USAGE
  $ heroku auth:2fa

ALIASES
  $ heroku 2fa
  $ heroku twofactor

COMMANDS
  auth:2fa:disable  disables 2fa on account

Heroku CLI 命令是分层的。它们通常会有一个或多个子命令,您可以在冒号后指定这些子命令,如上例所示。此外,其中一些子命令可能在命令层次结构的顶层具有可用的别名。例如,键入heroku auth:2faheroku 2faor具有相同的效果heroku twofactor

$ heroku auth:2fa
Two-factor authentication is enabled

$ heroku 2fa
Two-factor authentication is enabled

$ heroku twofactor
Two-factor authentication is enabled

所有三个命令都会给出相同的结果,您可以从中选择一个更容易记住的命令。

在这个简短的部分中,您在计算机上安装了 Heroku CLI 并熟悉了它的语法。您已经看到了一些方便的命令。现在,要充分利用这个命令行工具,您需要登录您的 Heroku 帐户。

第 5 步:使用 Heroku CLI 登录

即使不创建 Heroku 帐户,您也可以安装 Heroku CLI。但是,您必须验证您的身份并证明您拥有相应的 Heroku 帐户才能对其进行有意义的操作。在某些情况下,您甚至可能拥有多个帐户,因此登录允许您指定在特定时刻使用哪个帐户。

稍后您将了解到,您不会永久保持登录状态。登录以确保您有权访问并确保您使用正确的帐户是一个好习惯。最直接的登录方式是通过以下heroku login命令:

$ heroku login
heroku: Press any key to open up the browser to login or q to exit:

如果您之前登录到 Heroku 仪表板,这将打开您的默认 Web 浏览器并整齐地获取您的会话 cookie。否则,如果您启用了双因素身份验证,您将需要提供您的用户名、密码和可能的另一个身份证明。成功登录后,您可以关闭选项卡或浏览器窗口并返回终端。

注意:您还可以通过将--interactive标志附加到命令来使用无头模式登录,这将提示您输入用户名和密码,而不是启动 Web 浏览器。但是,这不适用于启用多因素身份验证。

当您使用 CLI 登录时,会话 cookie 的暴露是暂时的,因为 Heroku 会生成一个在有限时间内有效的新授权令牌。它存储在标准令牌.netrc在文件中的主目录,但你也可以使用Heroku的仪表板或检查它heroku authheroku authorizations插件:

$ heroku auth:whoami
jdoe@company.com

$ heroku auth:token
 ›   Warning: token will expire today at 11:29 PM
 ›   Use heroku authorizations:create to generate a long-term token
f904774c-ffc8-45ae-8683-8bee0c91aa57

$ heroku authorizations
Heroku CLI login from 54.239.28.85  059ed27c-d04a-4349-9dba-83a0169277ae  global

$ heroku authorizations:info 059ed27c-d04a-4349-9dba-83a0169277ae
Client:      <none>
ID:          059ed27c-d04a-4349-9dba-83a0169277ae
Description: Heroku CLI login from 54.239.28.85
Scope:       global
Token:       f904774c-ffc8-45ae-8683-8bee0c91aa57
Expires at:  Fri Jul 02 2021 23:29:01 GMT+0200 (Central European Summer Time) (in about 8 hours)
Updated at:  Fri Jul 02 2021 15:29:01 GMT+0200 (Central European Summer Time) (1 minute ago)

过期策略似乎在写这篇教程的时候有点出问题。官方文档说它默认应该保持有效一年,而Heroku CLI显示大约一个月,这也对应于会话cookie过期。使用 Heroku Web 界面手动重新生成令牌将其减少到大约 8 小时。但是,如果您测试实际到期日期是多少,您会发现它完全不同。如果您在学习本教程时对到期政策感到好奇,请自行探索。

无论如何,该heroku login命令仅用于开发。在生产环境中,您通常会生成一个长期存在的用户授权,该授权永远不会随authorizations插件过期。它可以通过Heroku API方便地用于脚本和自动化目的。

第 6 步:创建 Heroku 应用程序

在这一步中,您将创建您的第一个 Heroku 应用程序并了解它如何与 Git 集成。最后,您的项目将拥有一个公开可用的域地址

在 Django 项目中,应用程序是封装可重用功能的独立代码单元。另一方面,Heroku 应用程序像可扩展的虚拟计算机一样工作,能够托管您的整个 Django 项目。每个应用程序都包含源代码、必须安装的依赖项列表以及运行项目的命令。

每个项目至少有一个 Heroku 应用程序,但拥有更多应用程序并不少见。例如,您可能希望同时运行项目的开发暂存生产版本。每个都可以连接到不同的数据源并具有不同的功能集。

注意: Heroku 管道允许您按需创建、推广和销毁应用程序,以促进持续交付工作流。你甚至可以连接 GitHub,这样每个功能分支都会收到一个临时应用程序进行测试。

要使用 Heroku CLI 创建您的第一个应用程序,请确保您已经登录到 Heroku,然后运行heroku apps:create命令或其别名:

$ heroku create
Creating app... done, ⬢ polar-island-08305
https://polar-island-08305.herokuapp.com/ | https://git.heroku.com/polar-island-08305.git

默认情况下,它会选择一个保证唯一的随机应用名称,例如polar-island-08305. 您也可以选择自己的,但它必须在整个 Heroku 平台上普遍唯一,因为它是您免费获得的域名的一部分。你会很快发现它是否已经被占用:

$ heroku create portfolio-project
Creating ⬢ portfolio-project... !
 ▸    Name portfolio-project is already taken

如果您考虑一下有多少人使用 Heroku,那么有人已经创建了一个名为 的应用程序也就不足为奇了portfolio-project。当您heroku create在 Git 存储库中运行该命令时,Heroku 会自动将一个新的远程服务器添加到您的.git/config文件中:

$ tail -n3 .git/config
[remote "heroku"]
    url = https://git.heroku.com/polar-island-08305.git
    fetch = +refs/heads/*:refs/remotes/heroku/*

Git 配置文件的最后三行定义了一个名为 的远程服务器heroku,它指向您唯一的 Heroku 应用程序。

通常,克隆存储库后,您的 Git 配置中将有一个远程服务器(例如,在 GitHub 或 Bitbucket 上)。但是,本地存储库中可以有多个Git 远程服务器。稍后您将使用该功能向 Heroku 发布新的应用程序和部署。

注意:有时,使用 Git 可能会变得一团糟。如果您注意到您不小心在本地 Git 存储库之外或通过 Web 界面创建了 Heroku 应用程序,那么您仍然可以手动添加相应的 Git 远程。首先,将目录更改为项目根文件夹。接下来,列出您的应用以查找所需的名称:

$ heroku apps
=== jdoe@company.com Apps
fathomless-savannah-61591
polar-island-08305
sleepy-thicket-59477

在确定了应用程序的名称后——在本例中,polar-island-08305你可以使用git remote add命令或gitHeroku CLI 中的相应插件添加一个名为 的远程heroku

$ heroku git:remote --app polar-island-08305
set git remote heroku to https://git.heroku.com/polar-island-08305.git

这将添加一个名为的远程服务器,heroku除非另有说明。

当你创建一个新的应用程序时,它会告诉你它在.herokuapp.com域中的公共网址。在本教程中,公共网址是https://polar-island-08305.herokuapp.com,但您的网址会有所不同。尝试将您的 Web 浏览器导航到您的唯一域,看看接下来会发生什么。如果您不记得确切的 URL,只需heroku open在项目根文件夹中时在终端中键入命令。它将打开一个新的浏览器窗口并获取正确的资源:

空的 Heroku 应用程序

很好!您的 Heroku 应用程序已经在响应 HTTP 请求。但是,它目前是空的,这就是 Heroku 显示通用占位符视图而不是您的内容的原因。让我们将您的 Django 项目部署到这个空白应用程序中。

第 7 步:将您的 Django 项目部署到 Heroku

此时,您已拥有开始在 Heroku 上托管 Django 项目所需的一切。但是,如果您现在尝试将项目部署到 Heroku,它会失败,因为 Heroku 不知道如何构建、打包和运行您的项目。它也不知道如何安装需求文件中列出的特定 Python 依赖项。你现在就解决这个问题。

选择构建包

Heroku 自动化了许多部署步骤,但它需要了解您的项目设置和技术堆栈。构建和部署项目的方法称为buildpack。已经有一些官方构建包可用于许多后端技术,包括 Node.js、Ruby、Java、PHP、Python、Go、Scala 和 Clojure。除此之外,您还可以找到用于不太流行的语言(例如 C)的第三方构建包。

您可以在创建新应用程序时手动设置一个,也可以让 Heroku 根据存储库中的文件检测它。Heroku 识别 Python 项目的一种方法是requirements.txt在项目根目录中查找文件。确保您已经创建了一个(您pip freeze设置虚拟环境时可能已经完成),并且您已将其提交到本地存储库。

其他一些有助于 Heroku 识别 Python 项目的文件是Pipfilesetup.py. Heroku 还将识别Django Web 框架并为其提供特殊支持。因此,如果您的项目包含requirements.txtPipfile、 或setup.py,那么除非您正在处理某些极端情况,否则通常不需要设置构建包。

选择 Python 版本(可选)

默认情况下,Heroku 会选择一个最新的 Python 版本来运行你的项目。但是,您可以通过runtime.txt在项目根目录中放置一个文件来指定不同版本的 Python 解释器,记住提交它:

$ echo python-3.9.6 > runtime.txt
$ git add runtime.txt
$ git commit -m "Request a specific Python version"

请注意,您的 Python 版本必须包含语义版本控制的所有major.minor.patch组件。虽然只有少数受支持的 Python运行时,但您通常可以调整补丁版本。还有对PyPy的测试版支持。

指定要运行的进程

现在 Heroku 知道如何构建您的 Django 项目,它需要知道如何运行它。一个项目可以由多个组件组成,例如 Web 组件、后台工作人员、关系数据库、NoSQL 数据库计划作业等。每个组件都在单独的进程中运行。

有四种主要的流程类型:

  1. web: 接收 HTTP 流量
  2. worker: 在后台执行工作
  3. clock: 执行预定的作业
  4. release: 在部署前运行任务

在本教程中,您将只查看 Web 进程,因为每个 Django 项目都至少需要一个。您可以在名为 的文件中定义它,该文件Procfile必须放在您的项目根目录中:

portfolio-project/
│
├── .git/
│
├── portfolio/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── venv/
│
├── .gitignore
├── db.sqlite3
├── manage.py
├── Procfile
├── requirements.txt
└── runtime.txt

Procfile是一种单一的、与语言无关的格式,用于定义组成项目的流程。它将指导 Heroku 如何运行您的 Web 服务器。虽然使用内置开发服务器不是在生产中运行 Django 项目的推荐做法,但您可以在本练习中使用它:

$ echo "web: python manage.py runserver 0.0.0.0:\$PORT" > Procfile
$ git add Procfile
$ git commit -m "Specify the command to run your project"

为了使服务器可以从 Heroku 云之外的世界访问,您指定地址 as0.0.0.0而不是默认的localhost。它将在公共网络接口上绑定服务器。Heroku 通过PORT环境变量提供端口号。

您现在可以通过使用 Heroku CLI 在本地运行 Django 项目来测试此配置:

$ heroku local

默认情况下,如果您没有明确指定进程类型,它将运行该web进程。该heroku local命令是一样的heroku local web。此外,如果您不使用--port标志设置端口号,则它将使用默认端口5000

您现在已经指定了希望 Heroku 运行的进程。当您http://localhost:5000/在 Web 浏览器中打开 URL时,您应该会再次在 Django 欢迎页面上看到熟悉的火箭。但是,要通过 公共接口访问相同的资源http://0.0.0.0:5000/,您需要调整 Django 配置,否则您将收到错误请求错误。

配置 Django

您之前构建了一个基本的 Django 项目,现在是对其进行配置以使其准备好在您的 Heroku 实例上运行的时候了。配置 Django 项目可让您微调从数据库凭据到模板引擎的各种设置

要通过非本地网络地址访问您的 Django 项目,您需要ALLOWED_HOSTS在您的项目设置中指定。除此之外,Python 的 Django buildpack 会为collectstatic您运行命令,这需要STATIC_ROOT定义选项。无论您是否使用 Heroku,在部署 Django 项目时还有一些配置选项需要更改,但在此阶段它们不是强制性的。

您可以使用快捷方式安装一个方便的django-heroku包,而不是手动配置 Django,它可以处理所有这些以及更多。在继续之前确保您处于正确的虚拟环境中,并记住在完成后刷新您的需求文件:

(portfolio) $ python -m pip install django-heroku
(portfolio) $ python -m pip freeze > requirements.txt

这将使用项目的最新依赖项替换您的需求文件的内容。接下来,将这两行 Python 代码附加到您的portfolio/settings.py文件中,之后不要忘记返回到项目根文件夹:

(portfolio) $ pushd portfolio/
(portfolio) $ echo "import django_heroku" >> settings.py
(portfolio) $ echo "django_heroku.settings(locals())" >> settings.py
(portfolio) $ popd

或者,如果它们在您的 shell 中不起作用,则使用cd portfolio/andcd ..代替pushdandpopd命令。

因为您echo使用上面的附加重定向运算符 ( >>)附加了命令的输出,所以您现在在 Django 设置文件的最底部有两行代码:

# portfolio/settings.py

# ...

import django_heroku
django_heroku.settings(locals())

这将使用基于项目布局和环境变量的值更新本地命名空间中的变量。最后,不要忘记将更改提交到本地 Git 存储库:

(portfolio) $ git commit -am "Automatic configuration with django-heroku"

现在,您应该能够使用0.0.0.0主机名访问您的 Django Web 服务器。没有它,您将无法通过公共 Heroku 域访问您的应用程序。

配置 Heroku 应用程序

您为项目选择了 buildpack 和 Python 版本。您还指定了 Web 进程来接收 HTTP 流量并配置了您的 Django 项目。将 Django 项目部署到 Heroku 之前的最后一个配置步骤需要在远程 Heroku 应用程序上设置环境变量。

无论您的云提供商是哪家,配置管理都很重要。特别是,敏感信息,例如数据库密码或用于对 Django 会话进行加密签名的密钥,不得存储在代码中。您还应该记住禁用调试模式,因为它会使您的站点容易受到黑客攻击。但是,请保持本教程的原样,因为您将不会显示任何自定义内容。

传递此类数据的常用方法是环境变量。Heroku 允许您通过heroku config命令管理应用程序的环境变量。例如,您可能希望从环境变量中读取 Django 密钥,而不是将其硬编码到settings.py文件中。

既然你安装了django-heroku,你就可以让它处理细节。它检测SECRET_KEY环境变量并使用它来设置用于加密签名的 Django 密钥。保持该密钥的安全至关重要。在 中portfolio/settings.py,找到 Django 定义SECRET_KEY变量的自动生成行并将其注释掉:

# SECURITY WARNING: keep the secret key used in production secret!
# SECRET_KEY = 'django-insecure-#+^6_jx%8rmq9oa(frs7ro4pvr6qn7...

除了注释掉SECRET_KEY变量之外,您还可以完全删除它。但是现在先握住你的马,因为你可能马上就需要它了。

当您heroku local现在尝试运行时,它会抱怨不再定义 Django 密钥,并且服务器不会启动。要解决此问题,您可以在当前终端会话中设置变量,但创建一个.env以所有变量命名的特殊文件用于本地测试会更方便。Heroku CLI 将识别此文件并加载其中定义的环境变量。

注意: Git 不应跟踪.env您刚刚创建的文件。.gitignore只要您遵循前面的步骤并使用 gitignore.io 网站,它就应该已经列在您的文件中。

生成随机密钥的一种快速方法是使用 OpenSSL 命令行工具:

$ echo "SECRET_KEY=$(openssl rand -base64 32)" > .env

如果您的计算机上没有安装 OpenSSL 并且您使用的是 Linux 机器或 macOS,那么您还可以使用Unix 伪随机数生成器生成密钥:

$ echo "SECRET_KEY=$(head -c 32 /dev/urandom | base64)" > .env

这两种方法中的任何一种都将确保真正随机的密钥。您可能会想使用安全性低得多的工具,例如将其设为md5sum当前日期,但这并不真正安全,因为攻击者可以枚举可能的输出。

如果上述命令都不适用于您的操作系统,则暂时取消注释SECRET_KEY变量portfolio/settings.py并在活动虚拟环境中启动 Django shell:

(portfolio) $ python manage.py shell

在那里,您将能够使用 Django 的内置管理实用程序生成一个新的随机密钥:

>>>
>>> from django.core.management.utils import get_random_secret_key
>>> print(get_random_secret_key())
6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%

获取该密钥并使用它来设置文件中的SECRET_KEY变量.env

$ echo 'SECRET_KEY=6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%' > .env

heroku local命令会自动获取.env文件中定义的环境变量,因此它现在应该可以按预期工作。SECRET_KEY如果您取消注释变量,请记住再次注释掉它!

最后一步是为远程 Heroku 应用程序指定一个 Django 密钥:

$ heroku config:set SECRET_KEY='6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%'
Setting SECRET_KEY and restarting ⬢ polar-island-08305... done, v3
SECRET_KEY: 6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%

这将在远程 Heroku 基础设施上永久设置一个新的环境变量,它将立即可供您的 Heroku 应用程序使用。您可以在 Heroku 仪表板或 Heroku CLI 中显示这些环境变量:

$ heroku config
=== polar-island-08305 Config Vars
SECRET_KEY: 6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%

$ heroku config:get SECRET_KEY
6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%

稍后,您可以用另一个值覆盖它或完全删除它。轮换机密通常是减轻安全威胁的好主意。一旦秘密泄漏,您应该迅速更改它以防止未经授权的访问并限制损害。

发布应用

您可能已经注意到,使用heroku config:set命令配置环境变量会"v3"在输出中生成一个特殊的字符串,它类似于版本号。这不是巧合。每次您通过部署新代码或更改配置来修改您的应用程序时,您都是在创建一个新版本,它会增加您之前看到的 v-number。

要列出您的应用程序发布的时间顺序历史,请再次使用 Heroku CLI:

$ heroku releases
=== polar-island-08305 Releases - Current: v3
v3  Set SECRET_KEY config vars  jdoe@company.com  2021/07/02 14:24:29 +0200 (~ 1h ago)
v2  Enable Logplex              jdoe@company.com  2021/07/02 14:19:56 +0200 (~ 1h ago)
v1  Initial release             jdoe@company.com  2021/07/02 14:19:48 +0200 (~ 1h ago)

列表中的项目按从最新到最旧的顺序排列。版本号始终递增。即使您将应用程序回滚到以前的版本,它也会创建一个新版本以保留完整的历史记录。

使用 Heroku 发布新应用程序归结为将代码提交到本地 Git 存储库,然后将您的分支推送到远程 Heroku 服务器。但是,在此之前,请务必仔细检查是否有git status任何未提交的更改,并根据需要将它们添加到本地存储库,例如:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   portfolio/settings.py

no changes added to commit (use "git add" and/or "git commit -a")

$ git add .
$ git commit -m "Remove a hardcoded Django secret key"

虽然您可以推送任何本地分支,但必须将其推送到特定的远程分支才能使部署工作。Heroku 仅从远程mainmaster分支部署。如果您遵循并使用该git init命令创建了存储库,那么您的默认分支应命名为master. 或者,如果您在 GitHub 上创建它,那么它将命名为main.

由于远程 Heroku 服务器上存在mainmaster分支,因此您可以使用速记语法来触发构建和部署:

$ git push heroku master

在这里,master指的是您的本地和远程分支。如果您想推送不同的本地分支,请指定其名称,例如bugfix/stack-overflow,后跟冒号 ( :) 和远程目标分支:

$ git push heroku bugfix/stack-overflow:master

现在让我们将默认分支推送到 Heroku,看看接下来会发生什么:

$ git push heroku master
(...)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Python app detected
remote: -----> Using Python version specified in runtime.txt
remote: -----> Installing python-3.9.6
remote: -----> Installing pip 20.2.4, setuptools 47.1.1 and wheel 0.36.2
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
(...)
remote: -----> Compressing...
remote:        Done: 60.6M
remote: -----> Launching...
remote:        Released v6
remote:        https://polar-island-08305.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/polar-island-08305.git
 * [new branch]      master -> master

将代码推送到 Heroku 就像推送到 GitHub、Bitbucket 或其他远程 Git 服务器一样。然而,除此之外,它还开始构建过程。Heroku 将根据您的项目文件确定正确的 buildpack。它将使用runtime.txt文件中指定的 Python 解释器并从requirements.txt.

在实践中,将您的代码一次推送到您选择的 Git 服务器(例如 GitHub)并让它通过webhook触发 Heroku 上的构建会更方便。如果您想进一步探索,可以在 Heroku 的官方文档中阅读有关GitHub 集成的信息。

注意:第一次将代码推送到 Heroku 时,可能需要一段时间,因为平台需要启动新的 Python 环境、安装依赖项并为其容器构建映像。但是,后续部署会更快,因为已安装的依赖项已被缓存。

您可以将浏览器导航到 Heroku 应用程序的公共 URL。或者,heroku open在终端中输入命令将为您完成:

托管在公共领域的 Django 项目

恭喜!您刚刚公开了您的项目。

步骤 8:设置关系数据库

做得好!您几乎已经在 Heroku 上为您的 Django 项目设置了托管。等式的最后一个部分,所以坚持一两分钟。

到目前为止,您一直在使用由 Django 预先配置的基于文件的 SQLite 数据库。它适合在您的本地计算机上进行测试,但不适用于云中。Heroku 有一个临时文件系统,它会忘记自上次部署或服务器重启以来的所有更改。您需要一个独立的数据库引擎来将数据保存在云中。

在本教程中,您将使用 Heroku 提供的免费 PostgreSQL 实例作为完全托管的数据库即服务。如果需要,您可以使用不同的数据库引擎,但 PostgreSQL 通常不需要额外配置。

配置 PostgreSQL 服务器

当 Heroku 在您的项目中检测到 Django 框架时,它会自动启动一个免费但受限的PostgreSQL实例。它DATABASE_URL使用应用程序数据库的公共 URL设置环境变量。首次部署应用程序时会进行配置,这可以通过检查启用的附加组件和配置变量来确认:

$ heroku addons

Add-on                                            Plan       Price  State
────────────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-trapezoidal-06380)  hobby-dev  free   created
 └─ as DATABASE

The table above shows add-ons and the attachments to the current app (...)

$ heroku config
=== polar-island-08305 Config Vars
DATABASE_URL: postgres://ytfeiommjakmxb...amazonaws.com:5432/dcf99cdrgdaqba
SECRET_KEY:   6aj9il2xu2vqwvnitsg@!+4-8t3%zwr@$agm7x%o%yb2t9ivt%

通常,您需要portfolio/settings.py显式使用该变量,但由于您安装了该django-heroku模块,因此无需指定数据库 URL 或用户名和密码。它会自动从环境变量中获取数据库 URL 并为您配置设置。

此外,您无需安装数据库驱动程序即可连接到 Heroku 提供的 PostgreSQL 实例。另一方面,最好针对生产环境中使用的相同类型的数据库进行本地开发。它促进了您的环境之间的平等,并让您利用给定数据库引擎提供的高级功能。

安装时django-heroku,它已经psycopg2作为传递依赖获取:

(portfolio) $ pip list
Package         Version
--------------- -------
asgiref         3.4.1
dj-database-url 0.5.0
Django          3.2.5
django-heroku   0.3.1
pip             21.1.3
psycopg2        2.9.1
pytz            2021.1
setuptools      56.0.0
sqlparse        0.4.1
whitenoise      5.2.0

psycopg2是 PostgreSQL 数据库的 Python 驱动程序。由于驱动程序已经存在于您的环境中,您可以立即开始在您的应用程序中使用 PostgreSQL。

在免费的业余爱好开发计划中,Heroku 施加了一些限制。您最多可以有 10,000 行,这些行必须适合 1 GB 的存储空间。与数据库的连接不能超过 20 个。没有缓存,性能受到限制,以及许多其他限制。

您可以随时使用该heroku pg命令查看有关 Heroku 配置的 PostgreSQL 数据库的详细信息:

$ heroku pg
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           1/20
PG Version:            13.3
Created:               2021-07-02 08:55 UTC
Data Size:             7.9 MB
Tables:                0
Rows:                  0/10000 (In compliance) - refreshing
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-trapezoidal-06380

此简短摘要包含有关当前连接数、数据库大小、表数和行数等的信息。

在下面的小节中,您将了解如何对 Heroku 上的 PostgreSQL 数据库做一些有用的事情。

更新远程数据库架构

当您在 Django 应用程序中定义新模型时,您通常会创建新的迁移文件并将它们应用于数据库。要更新远程 PostgreSQL 实例的架构,您需要像以前一样运行相同的迁移命令,仅在 Heroku 环境中运行。稍后您将看到推荐的执行此操作的方法,但现在,您可以手动运行适当的命令:

$ heroku run python manage.py migrate
Running python manage.py migrate on ⬢ polar-island-08305... up, run.1434 (Free)
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
(...)

run插件会启动一个称为一次性 dyno的临时容器,它类似于可以访问应用程序源代码及其配置的Docker容器。由于 dynos 正在运行 Linux 容器,您可以在其中之一中执行任何命令,包括交互式终端会话:

$ heroku run bash
Running bash on ⬢ polar-island-08305... up, run.9405 (Free)
(~) $ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.

在临时 dyno 中运行Bash shell是检查或操作 Heroku 应用程序状态的常见做法。您可以将其视为登录到远程服务器。唯一的区别是您正在启动一个一次性虚拟机,其中包含您项目文件的副本并接收与您的实时 Web dyno 相同的环境变量。

但是,这种运行数据库迁移的方式并不是最可靠的,因为您可能会忘记它或在此过程中犯错误。您最好Procfile通过添加突出显示的行来自动执行此步骤:

web: python manage.py runserver 0.0.0.0:$PORT
release: python manage.py migrate

现在,每次发布新版本时,Heroku 都会处理所有待处理的迁移:

$ git commit -am "Automate remote migrations"
$ git push heroku master
(...)
remote: Verifying deploy... done.
remote: Running release command...
remote:
remote: Operations to perform:
remote:   Apply all migrations: admin, auth, contenttypes, sessions
remote: Running migrations:
remote:   No migrations to apply.
To https://git.heroku.com/polar-island-08305.git
   d9f4c04..ebe7bc5  master -> master

它仍然允许您选择是否实际进行任何新迁移。当您进行可能需要一段时间才能完成的大型迁移时,请考虑启用维护模式以避免在用户使用您的应用时损坏或丢失数据:

$ heroku maintenance:on
Enabling maintenance mode for ⬢ polar-island-08305... done

Heroku 将在维护模式下显示此友好页面:

维护模式下的 Heroku 应用程序

维护模式下的 Heroku 应用程序

heroku maintenance:off完成迁移后,不要忘记禁用它。

填充数据库

您已经通过应用迁移为 Django 模型创建了数据库表,但这些表大部分仍为空。您迟早会希望将一些数据放入其中。与数据库交互的最佳方式是通过Django 管理界面。要开始使用它,您必须首先远程创建一个超级用户:

$ heroku run python manage.py createsuperuser
Running python manage.py createsuperuser on ⬢ polar-island-08305... up, run.2976 (Free)
Username (leave blank to use 'u23948'): admin
Email address: jdoe@company.com
Password:
Password (again):
Superuser created successfully.

请记住在连接到远程 Heroku 应用程序的数据库中创建超级用户,方法是在相应的命令前加上heroku run。为超级用户提供唯一名称和安全密码后,您将能够登录到 Django 管理视图并开始向数据库添加记录。

您可以通过访问/admin放置在您唯一的 Heroku 应用程序域名之后的路径来访问 Django 管理视图,例如:

https://polar-island-08305.herokuapp.com/admin/

以下是登录后的外观:

Heroku 上的 Django 管理站点

Heroku 上的 Django 管理站点

直接操作远程数据库的一种选择是DATABASE_URL从 Heroku获取变量并解密其各个组件以通过您最喜欢的 SQL 客户端进行连接。或者,Heroku CLI 提供了一个方便的psql插件,它的工作方式类似于标准的 PostgreSQL 交互式终端,但不需要安装任何软件:

$ heroku psql
--> Connecting to postgresql-round-16446
psql (10.17 (Ubuntu 10.17-0ubuntu0.18.04.1), server 13.3 (Ubuntu 13.3-1.pgdg20.04+1))
WARNING: psql major version 10, server major version 13.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

polar-island-08305::DATABASE=> SELECT username, email FROM auth_user;
 username |      email
----------+------------------
 admin    | jdoe@company.com
(1 row)

请注意该heroku psql命令如何将您连接到 Heroku 基础架构上的正确数据库,而无需任何详细信息,例如主机名、用户名或密码。此外,您无需安装 PostgreSQL 客户端即可使用 SQL 查询其中一个表。

作为 Django 开发人员,您可能习惯于依赖其对象关系映射器 (ORM)而不是手动键入 SQL 查询。您可以通过在远程 Heroku 应用程序中启动交互式Django shell来再次使用 Heroku CLI :

$ heroku run python manage.py shell
Running python manage.py shell on ⬢ polar-island-08305... up, run.9914 (Free)
Python 3.9.6 (default, Jul 02 2021, 15:33:41)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

接下来,导入内置User模型并使用其管理器从数据库中检索相应的用户对象:

>>>
>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: admin>]>

您应该会看到您之前创建的超级用户。使用 Django shell,您可以使用面向对象的 API 查询连接的数据库。如果你不喜欢默认的 shell,那么你可以安装一个替代的 Python REPL,比如IPythonbpython,Django 会识别它。

好吧,就是这样!您在 Heroku 上托管了一个成熟的 Django 项目,并连接了一个关系数据库。例如,您现在可以在 GitHub 上的README文件中共享其公共链接,让世界欣赏您的工作。

结论

现在,您知道如何将您的想法转化为您的朋友和家人会喜欢的实时 Web 应用程序。也许,人力资源部门的某个人可能会偶然发现您的一个项目并为您提供工作。注册一个免费的 Heroku 帐户来托管您的 Django 代码是进入云计算世界的最佳方式之一。

在本教程中,您学习了如何:

  • 在几分钟内让您的Django项目上线
  • 使用Git将您的项目部署到 Heroku
  • 使用Django-Heroku集成库
  • 将你的 Django 项目连接到一个独立的关系数据库
  • 管理配置以及敏感数据

您可以通过以下链接下载最终源代码以及各个步骤的快照:

下一步

当谈到 Heroku 的可能性时,本教程几乎没有触及表面。它有意掩盖了许多细节,但 Heroku 可以提供更多,即使免费帐户有限。如果您想让您的项目更上一层楼,请考虑以下一些想法:

  • 配置一个 WSGI 服务器:在公开你的项目之前,首先要做的是用更安全和性能更好的东西替换内置的 Django 开发服务器,比如 Gunicorn。Django 提供了一个方便的部署清单,其中包含您可以通过的最佳实践。

  • 启用日志记录:在云中运行的应用程序并不直接由您控制,这使得调试和故障排除比在本地计算机上运行更加困难。因此,您应该使用 Heroku 的附加组件之一启用日志记录。

  • 提供静态文件:使用 Amazon S3 或内容交付网络 (CDN) 等外部服务来托管 CSS、JavaScript 或图片等静态资源。这可能会显着卸载您的 Web 服务器并利用缓存来加快下载速度。

  • 提供动态内容:由于 Heroku 的临时文件系统,用户提供给您的应用程序的数据无法作为本地文件持久化。使用关系数据库甚至 NoSQL 数据库并不总是最有效或最方便的选择。在这种情况下,您可能希望使用 Amazon S3 等外部服务。

  • 添加自定义域:默认情况下,您的 Heroku 应用程序托管在该.herokuapp.com域中。虽然它对于业余项目来说快速且有用,但您可能希望在更专业的环境中使用自定义域。

  • 添加 SSL 证书:当您定义自定义域时,您必须提供相应的 SSL 证书才能通过 HTTPS 公开您的应用程序。这是当今世界的必备品,因为一些网络浏览器供应商已经宣布他们将来不会显示不安全的网站。

  • 与 GitHub 联系:当拉取请求合并到主分支时,您可以通过允许 GitHub 触发新的构建和发布来自动化您的部署。这减少了手动步骤的数量并确保您的源代码安全。

  • 使用 Heroku 管道: Heroku 鼓励您以最少的努力遵循最佳实践。它通过选择性地自动创建测试环境来提供持续交付工作流。

  • 启用自动缩放:随着您的应用程序的增长,它将需要面对不断增长的资源需求。大多数电子商务平台每年都会在圣诞节前后出现流量高峰。该问题的当代解决方案是水平扩展,它以多个副本复制您的应用程序以满足需求。自动缩放可以在需要时响应此类峰值。

  • 拆分为微服务:当您的项目由多个独立的微服务组成时,水平扩展最有效,这些微服务可以单独扩展。这样的架构可以缩短开发时间,但也带来了一系列挑战。

  • 从 Heroku 迁移:一旦您开始接触 Heroku,您可能会考虑迁移到另一个云平台,例如Google App Engine,甚至是底层的 Amazon 基础设施以降低成本。

继续浏览Heroku 网站上的官方文档Python 教程,以找到有关这些主题的更多详细信息。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。