目录
[20.2.11 使用 Git 跟踪项目文件](#20.2.11 使用 Git 跟踪项目文件)
[1. 安装Git](#1. 安装Git)
[2. 配置Git](#2. 配置Git)
[3. 忽略文件](#3. 忽略文件)
[4. 提交项目](#4. 提交项目)
[20.2.12 推送到 Heroku](#20.2.12 推送到 Heroku)
[20.2.13 在 Heroku 上建立数据库](#20.2.13 在 Heroku 上建立数据库)
[20.2.14 改进 Heroku 部署](#20.2.14 改进 Heroku 部署)
[1. 在Heroku上创建超级用户](#1. 在Heroku上创建超级用户)
20.2.11 使用 Git 跟踪项目文件
如果你阅读完了第17章,就知道Git是一个版本控制程序,让你能够在每次成功实现新功能 后都拍摄项目代码的快照。无论出现什么问题(如实现新功能时不小心引入了bug),你都可以轻 松地恢复到最后一个可行的快照。每个快照都被称为提交。 使用Git意味着你在试着实现新功能时无需担心破坏项目。将项目部署到服务器时,需要确 保部署的是可行版本。如果你想更详细地了解Git和版本控制,请参阅附录D。
1. 安装Git
Heroku Toolbelt包含Git,因此它应该已经安装到了你的系统中。然而,在安装Heroku Toolbelt之 前打开的终端窗口中无法访问Git,因此请打开一个新的终端窗口,并在其中执行命令git --version:
python
(ll_env)learning_log$ git --version
git version 2.5.0
如果由于某种原因出现了错误消息,请参阅附录D中的Git安装说明。
2. 配置Git
Git跟踪谁修改了项目,即便项目由一个人开发时亦如此。为进行跟踪,Git需要知道你的用 户名和email。因此,你必须提供用户名,但对于练习项目,可随便伪造一个email:
python
(ll_env)learning_log$ git config --global user.name "ehmatthes"
(ll_env)learning_log$ git config --global user.email "eric@example.com"
如果你忘记了这一步,当你首次提交时,Git将提示你提供这些信息。
3. 忽略文件
我们无需让Git跟踪项目中的每个文件,因此将让Git忽略一些文件。为此,在manage.py所在 的文件夹中创建一个名为.gitignore的文件。注意,这个文件名以句点打头,且不包含扩展名。在 这个文件中输入如下内容:
.gitignore
python
ll_env/
__pycache__/
*.sqlite3
我们让Git忽略目录ll_env,因为我们随时都可以自动重新创建它。我们还指定不跟踪目录 pycache,这个目录包含Django运行.py文件时自动创建的.pyc文件。我们没有跟踪对本地数 据库的修改,因为这是一个糟糕的做法:如果你在服务器上使用的是SQLite,当你将项目推送到服务器时,可能会不小心用本地测试数据库覆盖在线数据库。
注意
如果你使用的是Python 2.7,请将_pycache_替换为*.pyc,因为Python 2.7不会创建目录 pycache。
4. 提交项目
我们需要为"学习笔记"初始化一个Git仓库,将所有必要的文件都加入到这个仓库中,并 提交项目的初始状态,如下所示:
python
1 (ll_env)learning_log$ git init
Initialized empty Git repository in /home/ehmatthes/pcc/learning_log/.git/
2 (ll_env)learning_log$ git add .
3 (ll_env)learning_log$ git commit -am "Ready for deployment to heroku."
[master (root-commit) dbc1d99] Ready for deployment to heroku.
43 files changed, 746 insertions(+)
create mode 100644 .gitignore
create mode 100644 Procfile
--snip--
create mode 100644 users/views.py
4 (ll_env)learning_log$ git status
# On branch master
nothing to commit, working directory clean
(ll_env)learning_log$
在1处,我们执行命令git init,在"学习笔记"所在的目录中初始化一个空仓库。在2处, 我们执行了命令git add .(千万别忘了这个句点),它将未被忽略的文件都添加到这个仓库中。 在3处,我们执行了命令git commit -am commit message,其中的标志-a让Git在这个提交中包含 所有修改过的文件,而标志-m让Git记录一条日志消息。
在4处,我们执行了命令git status,输出表明当前位于分支master中,而工作目录是干净 (clean)的。每当你要将项目推送到Heroku时,都希望看到这样的状态。
20.2.12 推送到 Heroku
我们终于为将项目推送到Heroku做好了准备。在活动的虚拟环境中,执行下面的命令:
python
1 (ll_env)learning_log$ heroku login
Enter your Heroku credentials.
Email: eric@example.com
Password (typing will be hidden):
Logged in as eric@example.com
2 (ll_env)learning_log$ heroku create
Creating afternoon-meadow-2775... done, stack is cedar-14
https://afternoon-meadow-2775.herokuapp.com/ |
https://git.heroku.com/afternoon-meadow-2775.git
Git remote heroku added
3 (ll_env)learning_log$ git push heroku master
--snip--
remote: -----> Launching... done, v6
4 remote: https://afternoon-meadow-2775.herokuapp.com/ deployed to Heroku
remote: Verifying deploy.... done.
To https://git.heroku.com/afternoon-meadow-2775.git
bdb2a35..62d711d master -> master
(ll_env)learning_log$
首先,在终端会话中,使用你在https://heroku.com/创建账户时指定的用户名和密码来登录 Heroku(见1)。然后,让Heroku创建一个空项目(见2)。Heroku生成的项目名由两个单词和一 个数字组成,你以后可修改这个名称。接下来,我们执行命令git push heroku master(见3), 它让Git将项目的分支master推送到Heroku刚才创建的仓库中;Heroku随后使用这些文件在其服务 器上创建项目。4处列出了用于访问这个项目的URL。
执行这些命令后,项目就部署好了,但还未对其做全面的配置。为核实正确地启动了服务器 进程,请执行命令heroku ps:
python
(ll_env)learning_log$ heroku ps
1 Free quota left: 17h 40m
2 === web (Free): `gunicorn learning_log.wsgi __log-file -`
web.1: up 2015/08/14 07:08:51 (~ 10m ago)
(ll_env)learning_log$
输出指出了在接下来的24小时内,项目还可在多长时间内处于活动状态(见1)。编写本书 时,Heroku允许免费部署在24小时内最多可以有18小时处于活动状态。项目的活动时间超过这个 限制后,将显示标准的服务器错误页面,稍后我们将设置这个错误页面。在2处,我们发现启动 了Procfile指定的进程。
现在,我们可以使用命令heroku open在浏览器中打开这个应用程序了:
python
(ll_env)learning_log$ heroku open
Opening afternoon-meadow-2775... done
你也可以启动浏览器并输入Heroku告诉你的URL,但上述命令可实现同样的结果。你将看到 "学习笔记"的主页,其样式设置正确无误,但你还无法使用这个应用程序,因为我们还没有建 立数据库。
注意
部署到Heroku的流程会不断变化。如果你遇到无法解决的问题,请通过查看Heroku文档 来获取帮助。为此,可访问https://devcenter.heroku.com/,单击Python,再单击链接Getting Started with Django。如果你看不懂这些文档,请参阅附录C提供的建议。
20.2.13 在 Heroku 上建立数据库
为建立在线数据库,我们需要再次执行命令migrate,并应用在开发期间生成的所有迁移。要对Heroku项目执行Django和Python命令,可使用命令heroku run。下面演示了如何对Heroku部 署执行命令migrate:
python
1 (ll_env)learning_log$ heroku run python manage.py migrate
2 Running `python manage.py migrate` on afternoon-meadow-2775... up, run.2435
--snip--
3 Running migrations:
--snip--
Applying learning_logs.0001_initial... OK
Applying learning_logs.0002_entry... OK
Applying learning_logs.0003_topic_user... OK
Applying sessions.0001_initial... OK
(ll_env)learning_log$
我们首先执行了命令heroku run python manage.py migrate(见1);Heroku随后创建一个终 端会话来执行命令migrate(见2)。在3处,Django应用默认迁移以及我们在开发"学习笔记" 期间生成的迁移。 现在如果你访问这个部署的应用程序,将能够像在本地系统上一样使用它。然而,你看不到 你在本地部署中输入的任何数据,因为它们没有复制到在线服务器。一种通常的做法是不将本地 数据复制到在线部署中,因为本地数据通常是测试数据。 你可以分享"学习笔记"的Heroku URL,让任何人都可以使用它。在下一节,我们将再完 成几个任务,以结束部署过程并让你能够继续开发"学习笔记"。
20.2.14 改进 Heroku 部署
在本节中,我们将通过创建超级用户来改进部署,就像在本地一样。我们还将让这个项目更 安全:将DEBUG设置为False,让用户在错误消息中看不到额外的信息,以防他们使用这些信息来 攻击服务器。
1. 在Heroku上创建超级用户
我们知道可使用命令heroku run来执行一次性命令,但也可这样执行命令:在连接到了Heroku 服务器的情况下,使用命令heroku run bash来打开Bash终端会话。Bash是众多Linux终端运行的 语言。我们将使用Bash终端会话来创建超级用户,以便能够访问在线应用程序的管理网站:
python
(ll_env)learning_log$ heroku run bash
Running `bash` on afternoon-meadow-2775... up, run.6244
1 ~ $ ls
learning_log learning_logs manage.py Procfile requirements.txt runtime.txt users
staticfiles
2 ~ $ python manage.py createsuperuser
Username (leave blank to use 'u41907'): ll_admin
Email address:
Password:
Password (again):
Superuser created successfully.
3 ~ $ exit
exit
(ll_env)learning_log$
在1处,我们执行命令ls,以查看服务器上有哪些文件和目录;服务器包含的文件和目录应 该与本地系统相同。你可以像遍历其他文件系统一样遍历这个文件系统。
注意
即便你使用的是Windows系统,也应使用这里列出的命令(如ls而不是dir),因为你正通 过远程连接运行一个Linux终端。
在2处,我们执行了创建超级用户的命令,它像第18章在本地系统创建超级用户一样提示你 输入相关的信息。在这个终端会话中创建超级用户后,使用命令exit返回到本地系统的终端会话 (见3)。
现在,你可以在在线应用程序的URL末尾添加/admin/来登录管理网站了。对我而言,这个 URL为https://afternoon-meadow-2775.herokuapp.com/admin/。 如果已经有其他人开始使用这个项目,别忘了你可以访问他们的所有数据!千万别不把这当 回事,否则用户就不会再将其数据托付给你了。
- 在Heroku上创建对用户友好的URL
你可能希望URL更友好,比https://afternoon-meadow-2775.herokuapp.com/更好记。为此,可 只需使用一个命令来重命名应用程序:
python
(ll_env)learning_log$ heroku apps:rename learning-log
Renaming afternoon-meadow-2775 to learning-log... done
https://learning-log.herokuapp.com/ | https://git.heroku.com/learning-log.git
Git remote heroku updated
(ll_env)learning_log$
给应用程序命名时,可使用字母、数字和连字符;你想怎么命名应用程序都可以,只要指定 的名称未被别人使用就行。现在,项目的URL变成了https://learning-log.herokuapp.com/;使用以 前的URL再也无法访问它,命令apps:rename 将整个项目都移到了新的URL处。
注意
你使用Heroku提供的免费服务来部署项目时,如果项目在指定的时间内未收到请求或过 于活跃,Heroku将让项目进入休眠状态。用户初次访问处于休眠状态的网站时,加载时 间将更长,但对于后续请求,服务器的响应速度将更快。这就是Heroku能够提供免费部 署的原因所在。