将其部署到一台服务器,让任何有网络连接的人都能够使用它。为此,将使用Heroku,这是一个基于Web的平台,能够管理Web应用程序的部署。让“学习笔记”在Heroku上运行。
1、建立Heroku账户
建立账户,访问https://heroku.com/ ,并单击其中的一个注册链接。注册账户是免费的,Heroku提供了免费试用服务,能够将项目部署到服务器并对其进行测试。
其中注册的邮箱需要是gmail邮箱或者其他国外邮箱,国内邮箱不行。
2、安装Heroku Toolbelt
要将项目部署到Heroku的服务器并对其进行管理,需要使用HerokuToolbelt提供的工具。要安装最新的HerokuToolbelt版本,访问https://toolbelt.heroku.com/ ,并根据使用的操作系统按相关的说明做。
验证heroku是否安装,执行命令:heroku --version
3、安装必要的包
在活动的虚拟环境中执行如下命令:
pip install dj-database-url
pip install dj-static
pip install static3
pip install gunicorn
dj-database-url 包帮助Django与Heroku使用的数据库进行通信,dj-static 和static3 包帮助Django 正确地管理静态文件,而gunicorn 是一个服务器软件,能够在在线环境中支持应用程序提供的服务。(静态文件包括样式规则和JavaScript文件。)
4、创建包含列表的文件requirements.txt
Heroku需要知道项目依赖于哪些包,因此使用pip来生成一个文件,其中列出了这些包。同样,进入活动虚拟环境,并执行如下命令:
命令freeze 让pip将项目中当前安装的所有包的名称都写入到文件requirements.txt中。打开文件requirements.txt,查看项目中安装的包及其版本(如果使用的是Windows系统, 看到的内容可能不全):
“学习笔记”依赖于6个特定版本的包,因此需要在相应的环境中才能正确地运行。部署“学习笔记”时,Heroku将安装requirements.txt列出的所有包,从而创建一个环境,其中包含在本地使用的所有包。
接下来,在包列表中添加psycopg2 ,它帮助Heroku管理活动数据库。为此,打开文件requirements.txt,并添加代码行psycopg2>=2.6.1 。这将安装2.6.1版的psycopg2 ——如果有更高的版本,则安装更高的版本。
如果有必不可少的包在系统中没有安装,将其添加到文件requirements.txt中。最终的文件requirements.txt应包含上面列出的每个包。
5、指定Python版本
在活动的虚拟环境中,执行命令python --version:
上面的输出表明,使用的是Python 3.6.6。在manage.py所在的文件夹中新建一个名为runtime.txt的文件,并在其中输入如下内容:
注意 :如果出现错误消息,指出不能使用指定的Python版本,访问https://devcenter.heroku.com/ 并单击Python,再单击链接Specifying a PythonRuntime。浏览打开的文 章,了解支持的Python版本,并使用与你使用的Python版本最接近的版本。
6、为部署到Heroku修改settings.py
在settings.py末尾添加一个片段,在其中指定一些Heroku环境设置:
# Heroku设置
if os.getcwd() == '/app': # 函数getcwd() ,它获取当前的工作目录 (当前运行的文件所在的目录),在Heroku部署中,这个目录总是/app
import dj_database_url
DATABASES = {
'default': dj_database_url.config(default='postgres://localhost')
}
# 让request.is_secure()承认X-Forwarded-Proto头
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 支持所有的主机头(host header)
ALLOWED_HOSTS = ['*']
# 静态资产配置
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
导入了dj_database_url ,用于在Heroku上配置服务器。Heroku使用PostgreSQL(也叫Postgres)——一种比SQLite更高级的数据库;这些设置对项目进行配置, 使其在Heroku上使用Postgres数据库。其他设置的作用分别如下:支持HTTPS请求;让Django能够使用Heroku的URL来提供项目提供的服务;设置项目,使其能够 在Heroku上正确地提供静态文件。
7、创建启动进程的Procfile
Procfile告诉Heroku启动哪些进程,以便能够正确地提供项目提供的服务。这个文件只包含一行,将其命名为Procfile(其中的P为大写),不指定文件扩展名,并保存到 manage.py所在的目录中。 Procfile的内容如下:
这行代码让Heroku将gunicorn用作服务器,并使用learning_log/wsgi.py中的设置来启动应用程序。标志log-file 告诉Heroku应将哪些类型的事件写入日志。
8、为部署到Heroku修改wsgi.py
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,并使用它来启动应用程序。
9、创建用于存储静态文件的目录
在Heroku上,Django搜集所有的静态文件,并将它们放在一个地方,以便能够高效地管理它们。
创建一个用于存储这些静态文件的目录。在文件夹learning_log中,有一个名称也为learning_log的子文件夹。在这个子文件夹中,新建一个名为static的文件夹,因此这个文件夹的路径为learning_log/learning_log/static/。还需在这个文件夹中创建一个占位文件,因为项目被推送到Heroku时,它将不会包含原来为空的文件夹。在目录static/中,创建一个名为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/.
是指出了在项目中添加这个文件的原因。
10、在本地使用gunicorn服务器
gunicorn不能在Windows系统上运行。
11、使用Git跟踪项目文件
Git是一个版本控制程序,能够在每次成功实现新功能后都拍摄项目代码的快照。无论出现什么问题(如实现新功能时不小心引入了bug),都可以轻松地恢复到最后一个可行的快照。每个快照都被称为提交 。
安装Git:
HerokuToolbelt包含Git,因此它应该已经安装到了系统中。然而,在安装HerokuToolbelt之前打开的终端窗口中无法访问Git,因此请打开一个新的终端窗口,并在其中执行命 令git --version :
配置git:
Git跟踪谁修改了项目,即便项目由一个人开发时亦如此。为进行跟踪,Git需要知道你的用户名和email。因此,必须提供用户名,但对于练习项目,可随便伪造一个email:
忽略文件:
无需让Git跟踪项目中的每个文件,因此将让Git忽略一些文件。为此,在manage.py所在的文件夹中创建一个名为.gitignore的文件。在该目录下,右键选择Git Bash 进入命令行,进入项目所在目录。输入 touch .gitignore ,生成“.gitignore”文件。在这个文件中输入如下内容:
ll_env/
__pycache__/
*.sqlite3
让Git忽略目录ll_env,因为随时都可以自动重新创建它。还指定不跟踪目录 \ _pycache__,这个目录包含Django运行.py文件时自动创建的.pyc文件。我们没有跟踪对本地数据库的修改,因为这是一个糟糕的做法:如果你在服务器上使用的是SQLite,当你将项目推送到服务器时,可能会不小心用本地测试数据库覆盖在线数据库。
提交项目
为“学习笔记”初始化一个Git仓库,将所有必要的文件都加入到这个仓库中,并提交项目的初始状态,如下所示:
(11_env) D:\Python3项目\learning_log> git init
Initialized empty Git repository in /home/zina/pcc/learning_log/.git/
(11_env) D:\Python3项目\learning_log> git add .
(11_env) D:\Python3项目\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
--snipcreate
mode 100644 users/views.py
(11_env) D:\Python3项目\learning_log> git status
# On branch master
nothing to commit, working directory clean
(11_env) D:\Python3项目\learning_log>
执行命令git init ,在“学习笔记”所在的目录中初始化一个空仓库。
执行了命令git add . (千万别忘了这个句点),它将未被忽略的文件都添 加到这个仓库中。
执行了命令git commit -am commit message ,其中的标志-a 让Git在这个提交中包含所有修改过的文件,而标志-m 让Git记录一条日志 消息。
执行了命令git status ,输出表明当前位于分支master中,而工作目录是干净 (clean)的。每当你要将项目推送到Heroku时,都希望看到这样的状态。
12、推送到Heroku
在活动的虚拟环境中,执行下面的命令:
首先,在终端会话中,使用在https://heroku.com/ 创建账户时指定的用户名和密码来登录Heroku。然后,让Heroku创建一个空项目。Heroku生成的项目名由两个 单词和一个数字组成,你以后可修改这个名称。接下来,我们执行命令git push heroku master (见❸),它让Git将项目的分支master推送到Heroku刚才创建的仓库中; Heroku随后使用这些文件在其服务器上创建项目。❹处列出了用于访问这个项目的URL。 执行这些命令后,项目就部署好了,但还未对其做全面的配置。为核实正确地启动了服务器进程,请执行命令heroku ps :
将会打开一网页,点击log in,然后可以关闭网页。打开终端:
继续输入命令,让Heroku创建一个空项目(Heroku生成的项目名由两个单词和一个数字组成,以后可修改这个名称),执行命令git push heroku master ,它让Git将项目的分支master推送到Heroku刚才创建的仓库中; Heroku随后使用这些文件在其服务器上创建项目:
执行这些命令后,项目就部署好了,但还未对其做全面的配置。为核实正确地启动了服务器进程,请执行命令heroku ps :
输出指出了项目app一个月可以有550个小时的活跃时间,项目的活动时 间超过这个限制后,将显示标准的服务器错误页面,稍后我们将设置这个错误页面。
现在,可以使用命令heroku open 在浏览器中打开这个应用程序了。
看到“学习笔记”的主页,其样式设置正确无误,但还无法使用这个应用程序,因为没有建立数据库。
13、在Heroku上建立数据库
为建立在线数据库,再次执行命令migrate ,并应用在开发期间生成的所有迁移。
要对Heroku项目执行Django和Python命令,可使用命令heroku run 。
Heroku随后创建一个终端会话来执行命令migrate 。Django应用默认迁移以 及我们在开发“学习笔记”期间生成的迁移。 现在如果访问这个部署的应用程序,将能够像在本地系统上一样使用它。然而,看不到在本地部署中输入的任何数据,因为它们没有复制到在线服务器。
在部署过程中遇到的问题:
敲代码要仔细,报错了看报错原因解决问题。如果上传代码多次失败,可删除在heroku删除app,重新创建上传。仓库指定创建的远程仓库。
对该项目进行了一定的改进,访问链接:https://boiling-fortress-84551.herokuapp.com,后续有时间还会更新完善下一些功能。
上一章:Python项目 | Web应用程序之样式设置