20.2.2 安装 Heroku Toolbelt
要将项目部署到Heroku的服务器并对其进行管理,需要使用Heroku Toolbelt提供的工具。要 安装最新的Heroku Toolbelt版本,请访问https://toolbelt.heroku.com/,并根据你使用的操作系统按 相关的说明做:使用只包含一行的终端命令,或下载并运行安装程序。
20.2.3 安装必要的包
你还需安装很多包,以帮助在服务器上支持Django项目提供的服务。为此,在活动的虚拟环 境中执行如下命令:
(ll_env)learning_log$ pip install dj-database-url (ll_env)learning_log$ pip install dj-static (ll_env)learning_log$ pip install static3 (ll_env)learning_log$ pip install gunicorn
务必逐个地执行这些命令,这样你就能知道哪些包未能正确地安装。dj-database-url包帮助 Django与Heroku使用的数据库进行通信,dj-static和static3包帮助Django正确地管理静态文件, 而gunicorn是一个服务器软件,能够在在线环境中支持应用程序提供的服务。(静态文件包括样 式规则和JavaScript文件。)
注意
在Windows系统中,有些必不可少的包可能无法安装,因此如果在你尝试安装有些这样 的包时出现错误消息,也不用担心。重要的是让Heroku在部署中安装这些包,下一节就 将这样做。
20.2.4 创建包含包列表的文件 requirements.txt
Heroku需要知道我们的项目依赖于哪些包,因此我们将使用pip来生成一个文件,其中列出 了这些包。同样,进入活动虚拟环境,并执行如下命令:
(ll_env)learning_log$ pip freeze > requirements.txt
命令freeze让pip将项目中当前安装的所有包的名称都写入到文件requirements.txt中。请打开 文件requirements.txt,查看项目中安装的包及其版本(如果你使用的是Windows系统,看到的内 容可能不全):
requirements.txt
Django==1.8.4 dj-database-url==0.3.0 dj-static==0.0.6 django-bootstrap3==6.2.2 gunicorn==19.3.0 static3==0.6.1
“学习笔记”依赖于6个特定版本的包,因此需要在相应的环境中才能正确地运行。我们部署 “学习笔记”时,Heroku将安装requirements.txt列出的所有包,从而创建一个环境,其中包含我们 在本地使用的所有包。有鉴于此,我们可以信心满满,深信项目部署到Heroku后,行为将与它在 本地系统上的完全相同。当你在自己的系统上开发并维护各种项目时,这将是一个巨大的优点。 接下来,我们需要在包列表中添加psycopg2,它帮助Heroku管理活动数据库。为此,打开文 件requirements.txt,并添加代码行psycopg2>=2.6.1。这将安装2.6.1版的psycopg2——如果有更高 的版本,则安装更高的版本:
requirements.txt
Django==1.8.4 dj-database-url==0.3.0 dj-static==0.0.6 django-bootstrap3==6.2.2 gunicorn==19.3.0 static3==0.6.1 psycopg2>=2.6.1
如果有必不可少的包在你的系统中没有安装,请将其添加到文件requirements.txt中。最终的 文件requirements.txt应包含上面列出的每个包。如果在你的系统中,requirements.txt列出的包的版 本与上面列出的不同,请保留原来的版本号。
注意
如果你使用的是Windows系统,请确保文件requirements.txt的内容与前面列出的一致,而 不要管你在系统中能够安装哪些包。
20.2.5 指定 Python 版本
如果你没有指定Python版本,Heroku将使用其当前的Python默认版本。下面来确保Heroku使 用我们使用的Python版本。为此,在活动的虚拟环境中,执行命令python --version:
(ll_env)learning_log$ python --version Python 3.5.0
上面的输出表明,我使用的是Python 3.5.0。请在manage.py所在的文件夹中新建一个名为 runtime.txt的文件,并在其中输入如下内容:
runtime.txt
python-3.5.0
这个文件应只包含一行内容,以上面所示的格式指定了你使用的Python版本;请确保输入小 写的python,在它后面输入一个连字符,再输入由三部分组成的版本号。
注意
如果出现错误消息,指出不能使用你指定的Python版本,请访问https://devcenter. heroku.com/并单击Python,再单击链接Specifying a Python Runtime。浏览打开的文章,了 解支持的Python版本,并使用与你使用的Python版本最接近的版本。
20.2.6 为部署到 Herohu 而修改 settings.py
现在需要在settings.py末尾添加一个片段,在其中指定一些Heroku环境设置:
settings.py
--snip-- # django-bootstrap3设置 BOOTSTRAP3 = { 'include_jquery': True, } # Heroku设置 1 if os.getcwd() == '/app': 2 import dj_database_url DATABASES = { 'default': dj_database_url.config(default='postgres://localhost') } # 让request.is_secure()承认X-Forwarded-Proto头 3 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 支持所有的主机头(host header) 4 ALLOWED_HOSTS = ['*'] # 静态资产配置 5 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = 'staticfiles' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
在1处,我们使用了函数getcwd(),它获取当前的工作目录(当前运行的文件所在的目录)。 在Heroku部署中,这个目录总是/app。在本地部署中,这个目录通常是项目文件夹的名称(就我 们的项目而言,为learning_log)。这个if测试确保仅当项目被部署到Heroku时,才运行这个代码 块。这种结构让我们能够将同一个设置文件用于本地开发环境和在线服务器。
在2处,我们导入了dj_database_url,用于在Heroku上配置服务器。Heroku使用PostgreSQL (也叫Postgres)——一种比SQLite更高级的数据库;这些设置对项目进行配置,使其在Heroku上 使用Postgres数据库。其他设置的作用分别如下:支持HTTPS请求(见3);让Django能够使用 Heroku的URL来提供项目提供的服务(见4);设置项目,使其能够在Heroku上正确地提供静态 文件(见5)。
20.2.7 创建启动进程的 Procfile
Procfile告诉Heroku启动哪些进程,以便能够正确地提供项目提供的服务。这个文件只包含一 行,你应将其命名为Procfile(其中的P为大写),不指定文件扩展名,并保存到manage.py所在的 目录中。 Procfile的内容如下:
Procfile
web: gunicorn learning_log.wsgi --log-file -
这行代码让Heroku将gunicorn用作服务器,并使用learning_log/wsgi.py中的设置来启动应用程 序。标志log-file告诉Heroku应将哪些类型的事件写入日志。
20.2.8 为部署到 Herohu 而修改 wsgi.py
为部署到Heroku,我们还需修改wsgi.py,因为Heroku需要的设置与我们一直在使用的设置稍 有不同:
wsgi.py
--snip-- import os from django.core.wsgi import get_wsgi_application from dj_static import Cling os.environ.setdefault("DJANGO_SETTINGS_MODULE", "learning_log.settings") application = Cling(get_wsgi_application())
我们导入了帮助正确地提供静态文件的Cling,并使用它来启动应用程序。这些代码在本地 也适用,因此无需将其放在if代码块内。
20.2.9 创建用于存储静态文件的目录
在Heroku上,Django搜集所有的静态文件,并将它们放在一个地方,以便能够高效地管理它 们。我们将创建一个用于存储这些静态文件的目录。在文件夹learning_log中,有一个名称也为 learning_log的子文件夹。在这个子文件夹中,新建一个名为static的文件夹,因此这个文件夹的路 径为learning_log/learning_log/static/。我们还需在这个文件夹中创建一个占位文件,因为项目被推 送到Heroku时,它将不会包含原来为空的文件夹。在目录static/中,创建一个名为placeholder.txt 的文件:
placeholder.txt
This file ensures that learning_log/static/ will be added to the project. Django will collect static files and place them in learning_log/static/.
上述内容没有什么特别之处,只是指出了在项目中添加这个文件的原因。
20.2.10 在本地使用 gunicorn 服务器
如果你使用的是Linux或OS X,可在部署到Heroku前尝试在本地使用gunicorn服务器。为此, 在活动的虚拟环境中,执行命令heroku local以启动Procfile指定的进程:
(ll_env)learning_log$ heroku local Installing Heroku Toolbelt v4... done --snip-- forego | starting web.1 on port 5000 1 web.1 | [2015-08-13 22:00:45 -0800] [12875] [INFO] Starting gunicorn 19.3.0 2 web.1 | [2015-08-13 22:00:45 -0800] [12875] [INFO] Listening at: http://0.0.0.0:5000 (12875) 3 web.1 | [2015-08-13 22:00:45 -0800] [12878] [INFO] Booting worker with pid: 12878
首次执行命令heroku local时,将安装Heroku Toolbelt中的很多包。这里的输出表明启动了 gunicorn,其进程id为12875(见1)。处的输出表明,gunicorn在端口5000上侦听请求。另外, gunicorn还启动了一个工作进程(12878),用于帮助处理请求(见3)。
为确认一切运行正常,请访问http://localhost:5000/,你将看到“学习笔记”的主页,就像使 用Django服务器(runserver)时一样。为停止heroku local启动的进程,请按Ctrl + C,你将在本 地开发中继续使用runserver。
注意
gunicorn不能在Windows系统上运行,因此如果你使用的是Windows系统,请跳过这一步。 但这不会影响你将项目部署到Heroku。.