学习笔记目录
【day 1】python编程:从入门到实践学习笔记-安装、变量和简单数据类型
【day 2】python编程:从入门到实践学习笔记-列表以及其操作
【day 3】python编程:从入门到实践学习笔记-if 语句(末附练习答案代码)
【day 4】python编程:从入门到实践学习笔记-字典(末附练习答案代码)
【day 5】python编程:从入门到实践学习笔记-用户输入和while循环(末附答案代码)
【day 6】python编程:从入门到实践学习笔记-函数(末附练习答案代码)
【day 7】python编程:从入门到实践学习笔记-类(末附练习答案代码)
【day 8】python编程:从入门到实践学习笔记-文件和异常(末附练习答案代码)
【day 9】python编程:从入门到实践学习笔记-测试代码(末附练习答案代码)
【day 10】python编程:从入门到实践学习笔记-Django入门(一)
【day 11】python编程:从入门到实践学习笔记-Django入门(二)
【day 12】python编程:从入门到实践学习笔记-Django入门(三)
【day 13】python编程:从入门到实践学习笔记-Django入门(四)
【day 14】python编程:从入门到实践学习笔记-用户账户(一)
【day 15】python编程:从入门到实践学习笔记-用户账户(二)
【day 16】python编程:从入门到实践学习笔记-用户账户(三)
【day 17】python编程:从入门到实践学习笔记-设计样式和部署(一)
【day 18】python编程:从入门到实践学习笔记-设计样式和部署(二)& 补充
第二十章 设计样式和部署(一)
部署学习笔记
接下来我们将使用Heroku(基于Web的平台)管理Web应用程序的部署。
建立Heroku账户
访问https://signup.heroku.com注册一个帐号。
安装Heroku Toolbelt
安装Heroku Toolbelt,对部署到Heroku服务器的项目进行管理。访问https://toolbelt.heroku.com/进行安装。
安装必要的包
在虚拟环境中使用pip安装dj-database-url、dj-static、gunicorn,帮助在服务器上支持django项目提供的服务。
其中dj-database-url帮助django与Heroku使用的数据库进行通信,dj-static帮助django正确的管理静态文件,而gunicorn是一个服务器软件,能够在在线环境中支持应用程序提供的服务。
创建包含列表的文件requirements.txt
Heroku需要知道项目依赖那些包,因此我们使用pip来生成一个文件,其中列出依赖包。在虚拟环境中执行pip freeze > requirements.txt
.
#requirements.txt
dj-database-url==0.5.0
dj-static==0.0.6
Django==1.11.7
django-bootstrap3==9.1.0
gunicorn==19.7.1
pytz==2018.3
static3==0.7.0
我们部署时,Heroku将会安装以上列出的所有包。接着我们在包列表中添加 psycopg2,它帮助Heroku管理活动数据库。
#requirements.txt
dj-database-url==0.5.0
dj-static==0.0.6
Django==1.11.7
django-bootstrap3==9.1.0
gunicorn==19.7.1
pytz==2018.3
static3==0.7.0
psycopg2>=2.6.1
指定Python版本
如果没有指定python的版本,heroku将使用当前默认的版本。在虚拟环境中执行python --version
.
接着在manage.py所在的文件夹 中仙剑一个名为runtime.txt:
#runtime.txt
python-3.6.4
记住小写和减号!
为部署到Heroku而修改settings.py
在settings.py末尾添加
#settings.py
#--snip--
# Heroku设置
if os.getcwd() == '/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'),
)
首先我们使用了函数getcwd()
,用来获取当前的工作目录。在Heroku部署中,这个目录总是/app。在本地部署中,通常是项目文件夹的名称。
这个if测试确保仅当项目被部署到Heroku时,才运行这个代码块。这种结构让我们能够将同一个设置文件用于本地开发环境和在线服务器。
接着我们导入了dj_database_url,用于在Heroku配置服务器。Heroku使用PostgreSQL作为数据库。这些设置对项目进行配置,使其在Heroku上使用PostgreSQL。其他设置思维作用分别是:支持HTTPS请求;让djang能够使用Heroku的URL来提供服务;设置项目,使其能够在Heroku上正确提供静态文件。
创建启动进程的Procfile
在manage.py的文件中创建Procfile(无后缀)
web: gunicorn learning_log.wsgi --log-file -
这行代码让Heroku将gunicorn用作服务器,并使用learning_log/wsgi.py里的设置来启动应用程序。标志log-file告诉Heroku应将那些类型的事件写入日志。
为部署到Heroku而修改wsgi.py
修改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,并使用他来启动应用程序。
创建用于存储静态文件的目录
在目录
接着在manage.py的同一目录下创建文件夹static,并在static文件夹中新建一个placeholder.txt当作占位文件,因为项目被推送到Heroku时不会包含空文件夹。
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/.
使用Git跟踪项目文件
1.安装Git
如果你安装了Heroku Toolbelt,则里面已经包含Git了。
2.配置Git
执行
git config --global user.name "ehmatthes"
git config --global user.email "eric@example.com"
3.忽略文件
记住不要上传数据库文件!!!在manage.py所在的目录创建一个名为.gitignore的文件。
venv/
__pycache__/
*.sqlite3
4.提交项目
命令git init
表示在“学习笔记”所在的目录中初始化一个空仓库。命令git add .
表示将未被忽略的文件都添加到这个仓库。命令git status
输出表明当前位于分支master中,而工作目录是干净的。
推送到Heroku
在虚拟环境中执行
接着执行命令heroku ps
接着执行命令heroku open
在Heroku上建立数据库
为建立在线数据库,我们需要再次执行命令migrate
。要对Heroku项目执行django和python命令,可使用heroku run
命令
现在可以将这个应用程序的URL分享给你的小伙伴了~
改进Heroku部署
在这部分,我们将创建超级用户来改进部署。为了项目更安全,将DEBUG
设置为False
,防止他人看到错误信息。
1.在Heroku上创建超级用户
2.在Heroku上创建对用户友好的URL
确保项目的安全
修改settings.py
# Heroku设置
if os.getcwd() == '/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')
# 只允许Heroku托管这个项目
ALLOWED_HOSTS = ['learning-log.herokuapp.com']
DEBUG = False
# 静态资产配置
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
提交并推送修改
现在将settings.py的修改提交到Git仓库,在将修改推送到Heroku。
Heroku发现仓库发生了变化,因此重建项目,但不会重建数据库,所以不用在迁移数据库。
创建自定义错误页面
当用户遇到404或者500的错误时,会返回错误页面。404表示代码没错,但请求的对象不存在。500表示代码有问题。现在我们将自定义错误页面。
1.创建自定义模板
在learning_log/learning_log中新建一个 templates文件夹,创建404.html、505.html
#404.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>The item you requested is not available. (404)</h2>
{% endblock header %}
#500.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>The item you requested is not available. (404)</h2>
{% endblock header %}
这些新文件要求对settings.py做修改。
#--snip--
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'learning_log/templates')],
'APP_DIRS': True,
#--snip--
},
]
#--snip--
2.在本地查看错误页面
对本地的settings.py进行修改
#--snip--
# 安全警告,不要在在线环境中启用调试
DEBUG = False
ALLOWED_HOSTS = ['localhost']
#--snip--
当DUBUG
被设置False
时,必须在ALLOWED_HOSTS
中指定一个主机。
查看错误页面之后,将DUBUG
设置True
,方便进一步开发。(在settings.py中用于Heroku部署的部分中,确保DEBUG = False)。
3.将修改推送到Heroku
4.使用方法get_object_or_404()
现在当用户手动请求不存在的主题或条目,将导致500错误。这种情形应该视为404错误合适一点。因此我们使用函数get_object_or_404()
。修改views.py
#--snip--
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, Http404
#--snip--
@login_required
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = get_object_or_404(Topic, id=topic_id)
# 确定主题属于当前用户
#--snip--
修改之后记得提交。
继续开发
首先,对本地项目做必要的修改,如果在修改过程中创建了新文件,使用命令git add .
将他们加入到Git仓库中。如果有修改要求迁移数据库,也需要执行这个命令,因为每个迁移都将生成新的迁移文件。
然后,使用命令git commit -am "commit message"
将修改提交到仓库,在使用命令git push heroku master
将修改推送到Heroku。如果你在本地迁移了数据库,也需要迁移在线数据库。为此,你可以执行一次性命令heroku run python manage.py migrate
,也可以使用heroku run bash
打开一个远程终端,在其中执行python manage.py migrate
。然后访问在线项目,确认修改生效。
设置SECRET_KEY
Django根据settings.py中设置SECRET_KEY的值来实现大量的安全协议。
将项目从Heroku删除
1.在官网上删除。
2.执行heroku apps:destroy --app appname
本学习笔记到尾声啦,如果遇到什么解决不了的问题可以在评论提出来哦。
即将再见!
2018.3.31
修复笔记entry.text
文本过长导致的溢出。现已自动换行。
打开base.html并添加
<!--snip-->
<title>Learning Log</title>
{% bootstrap_css %}
{% bootstrap_javascript %}
<style>
div.lbreak{word-wrap: break-word;}
</style>
</head>
<!--snip-->
打开topic.html并添加
<!--snip-->
<div class="panel-body">
<div class='lbreak'>{{ entry.text|linebreaks }}</div>
</div>
</div> <!-- panel -->
<!--snip-->
done!
网友评论