Flask大型教程,第18部分:部署到Heroku

Flask大型教程,第18部分:部署到Heroku

💡 原文英文,约3400词,阅读约需13分钟。
📝

内容提要

本章介绍将Microblog应用部署到Heroku云平台。Heroku是PaaS服务,通过git推送部署,需提供Procfile和requirements.txt。因文件系统临时,需改用Postgres数据库、日志输出到stdout、启动时编译翻译文件,并配置环境变量、添加gunicorn和psycopg2-binary依赖,最后用git push完成部署。

🔎

延伸解读

Heroku 的临时文件系统及其影响

Heroku 的虚拟化平台使用临时文件系统,服务器可能随时重置,本地保存的数据无法持久化。这直接影响 Microblog 的三个文件依赖:SQLite 数据库、日志文件和编译后的翻译文件。因此,必须改用 Heroku Postgres 数据库、将日志输出到 stdout,并在启动时重新编译翻译文件。理解这一点是成功部署的关键。

环境变量在 Heroku 部署中的核心作用

Heroku 通过环境变量向应用传递配置,如 DATABASE_URL、LOG_TO_STDOUT、FLASK_APP 等。文章演示了使用 heroku config:set 设置这些变量,并特别指出 SQLAlchemy 要求 Postgres URL 以 postgresql:// 开头,而 Heroku 提供的是 postgres://,因此需要在代码中进行字符串替换。此外,SECRET_KEY、邮件服务器等变量也需从本地 .env 文件迁移到 Heroku。

Procfile 与启动命令的编排

Procfile 定义了 Heroku 如何启动应用。对于 Web 应用,进程名必须为 web。文章中的 Procfile 将数据库迁移、翻译编译和启动 Gunicorn 服务器串联为一条命令,确保每次部署或重启时这些步骤自动执行。Gunicorn 与 Heroku 集成良好,默认使用 $PORT 环境变量,并可通过 WEB_CONCURRENCY 变量调整工作进程数,无需修改 Procfile。

部署流程与依赖调整

部署通过 git push 完成,将代码推送到 Heroku 的远程仓库。文章区分了两种推送方式:使用示例代码时需创建分支并推送为 main,使用自己的仓库则直接推送 main 或 master。此外,requirements.txt 中需新增 gunicorn 和 psycopg2-binary 依赖,前者作为生产级 Web 服务器,后者提供 Postgres 数据库驱动。部署后可用 heroku logs 查看运行日志,便于排查启动错误。

❓

Q&A

Heroku 是什么?它和传统 Linux 服务器部署有什么区别?

Heroku 是一个平台即服务(PaaS)云托管平台,硬件、操作系统、语言解释器、数据库等都由服务商管理,你只需提供应用本身。相比传统 Linux 服务器部署,Heroku 免去了大量系统管理任务,部署通过 git push 完成,更简单省力。

部署 Flask 应用到 Heroku 需要哪些关键文件?

需要两个关键文件:Procfile(位于应用根目录,告诉 Heroku 如何启动应用)和 requirements.txt(列出所有 Python 依赖)。此外,应用必须放在 git 仓库中,通过 git push 部署。

为什么在 Heroku 上不能使用 SQLite 数据库?应该换成什么?

因为 Heroku 使用临时文件系统,虚拟服务器随时可能重置,SQLite 写入磁盘文件的数据无法持久保存。应改用 Heroku Postgres 数据库,通过 heroku addons:create heroku-postgresql:mini 创建,连接 URL 会存入 DATABASE_URL 环境变量。

如何让 Flask 应用在 Heroku 上正确记录日志?

Heroku 要求应用将日志输出到 stdout。需要设置环境变量 LOG_TO_STDOUT=1,并在应用工厂中根据该配置添加 StreamHandler 将日志输出到标准输出,而不是写入文件。这样可以用 heroku logs 命令查看日志。

Procfile 中应该写什么命令来启动 Microblog 应用?

Procfile 内容为:web: flask db upgrade; flask translate compile; gunicorn microblog:app。依次执行数据库迁移升级、编译语言翻译文件,最后用 gunicorn 启动应用。还需设置 FLASK_APP=microblog.py 环境变量。

部署到 Heroku 时,requirements.txt 需要新增哪些依赖?

需要新增 gunicorn(生产级 Web 服务器)和 psycopg2-binary(用于连接 Postgres 数据库)。psycopg2-binary 是预编译版本,无需 C 编译器,安装更方便。

如何将代码推送到 Heroku 完成部署?

使用 git push 命令。如果使用教程的 v0.18 代码,先创建分支:git checkout -b deploy,然后 git push heroku deploy:main。如果是自己的仓库,提交更改后运行 git push heroku main(或 master)。Heroku 只接受 main 或 master 作为部署分支。

🏷️

标签

➡️

继续阅读