500.html

{% extends "learning_logs/base.html" %}

{% block page_header %}
<h2>There has been an internal error. (500)</h2>
{% endblock page_header %}


这些新文件要求对settings.py做细微的修改:

settings.py

—snip—
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
—snip—
},
]
—snip—


这项修改让Django在根模板目录中查找错误页面模板。

  • 在本地查看错误页面

将项目推送到Heroku前,如果要在本地查看错误页面是什么样的,首先需要在本地设置中设置Debug=False ,以禁止显示默认的Django调试页面。为此,可对settings.py做如下修改(请确保修改的是settings.py中用于本地环境的部分,而不是用于Heroku的部分):

settings.py

—snip—
# 安全警告:不要在在线环境中启用调试!
DEBUG = False
—snip—


现在,请求不属于你的主题或条目,以查看404错误页面。然后请求不存在的主题或条目,以查看500错误页面。例如,如果输入http://localhost:8000/topics/999/,将出现500错误页面,除非你输入的主题已经超过了999个!

查看错误页面后,将本地DEBUG 的值重新设置为True ,为后续开发提供方便。(在管理Heroku设置的部分,确保处理DEBUG 的方式不变。)

注意  500错误页面不会显示任何有关当前用户的信息,因为发生服务器错误时,Django不会通过响应发送任何上下文信息。
  • 将修改推送到Heroku

现在需要提交对错误页面所做的修改,并将这些修改推送到Heroku:

❶ (ll_env)learning_log$ git add .
❷ (ll_env)learning_log$ git commit -am "Added custom 404 and 500 error pages."
3 files changed, 15 insertions(+), 10 deletions(-)
create mode 100644 templates/404.html
create mode 100644 templates/500.html
❸ (ll_env)learning_log$ git push heroku master
—snip—
remote: Verifying deploy…. done.
To https://git.heroku.com/learning-log.git
d5075a1..4bd3b1c master -> master
(ll_env)learning_log$


在❶处,执行命令git add . ,因为我们在项目中创建了一些新文件,需要让Git跟踪它们。然后,提交所做的修改(见❷),并将修改后的项目推送到Heroku(见❸)。

现在,错误页面出现时,其样式应该与网站其他部分一致。这样,在发生错误时,用户将不会感到别扭。

  • 使用方法get_object_or_404()

现在,如果用户手工请求不存在的主题或条目,将导致500错误。Django尝试渲染不存在的页面,但没有足够的信息来完成这项任务,进而引发了500错误。对于这种情形,将其视为404错误更合适。为此可使用Django快捷函数get_object_or_404() 。这个函数尝试从数据库获取请求的对象,如果这个对象不存在,就引发404异常。我们在views.py中导入这个函数,并用它替换函数get() :

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
—snip—
@login_required
def topic(request, topic_id):
"""显示单个主题及其所有的条目。"""
topic = get_object_or_404(Topic, id=topic_id)
# 确定主题属于当前用户。
—snip—


现在,如果请求不存在的主题(如使用URL http://localhost:8000/topics/999/),将看到404错误页面。为部署这里所做的修改,再次提交,并将项目推送到Heroku。

20.2.16 继续开发

将项目“学习笔记”推送到服务器后,你可能想进一步开发它或开发要部署的其他项目。更新项目的过程几乎完全相同。

首先,对本地项目做必要的修改。如果在修改过程中创建了新文件,使用命令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 。然后访问在线项目,确认期望看到的修改已生效。

在这个过程中很容易犯错,因此看到错误时不要大惊小怪。如果代码不能正确地工作,请重新审视所做的工作,尝试找出其中的错误。如果找不出错误,或者不知道如何撤销错误,请参阅附录C中有关如何寻求帮助的建议。不要羞于去寻求帮助:每个学习开发项目的人都可能遇到过你面临的问题,因此总有人乐意伸出援手。通过解决遇到的每个问题,可让你的技能稳步提高,最终能够开发可靠而有意义的项目,还能解决别人遇到的问题。

20.2.17 设置SECRET_KEY

Django根据settings.py中设置SECRET_KEY 的值来实现大量的安全协议。在这个项目中,提交到仓库的设置文件包含设置SECRET_KEY 。对于一个练习项目而言,这足够了,但对于生产网站,应更细致地处理设置SECRET_KEY 。如果你创建的项目的用途很重要,务必研究如何更安全地处理设置SECRET_KEY 。

20.2.18 将项目从Heroku删除

一个不错的练习是,使用同一个项目或一系列小项目执行部署过程多次,直到对部署过程了如指掌。然而,你需要知道如何删除部署的项目。Heroku限制了可免费托管的项目数,而你也不希望自己的账户中包含大量练习项目。

在Heroku网站登录后,将重定向到一个页面,其中列出了你托管的所有项目。单击要删除的项目,你将看到另一个页面,其中显示了有关这个项目的信息。单击链接Settings,再向下滚动,找到用于删除项目的链接并单击它。这种操作是不可撤销的,因此Heroku让你手工输入要删除的项目的名称,确认你确实要删除它。

如果喜欢在终端中工作,也可使用命令destroy 来删除项目:

(ll_env)learning_log$ heroku apps:destroy —app appname


appname 是要删除的项目的名称,可能类似于secret-lowlands-82594 ,也可能类似于learning-log (如果你重命名了项目)。你将被要求再次输入项目名,确认你确实要删除它。

注意  删除Heroku上的项目对本地项目没有任何影响。如果没有人使用你部署的项目,就尽管去练习部署过程好了,在Heroku上删除项目再重新部署完全合情合理。
动手试一试
练习20-3:在线博客  将你一直在开发的项目Blog部署到Heroku。确保将DEBUG 设置为False ,以免出现错误时用户看到完整的Django错误页面。
练习20-4:在更多的情况下显示404错误页面  在视图函数new_entry()edit_entry() 中,也使用函数get_object_or_404() 。完成这些修改后进行测试:输入类似于http://localhost:8000/new_entry/999/的URL,确认看到的是404错误页面。
练习20-5:扩展“学习笔记”  在“学习笔记”中添加一项功能,并将修改推送到在线部署。尝试做一项简单的修改,如在主页中对项目做更详细的描述。再尝试添加一项更高级的功能,如让用户能够将主题设置为公开的。为此,需要在模型Topic 中添加一个名为public 的属性(其默认值为False ),并在new_topic 页面中添加一个表单元素,让用户能够将私有主题改为公开。然后,需要迁移项目,并修改views.py,让未登录的用户也可以看到所有公开的主题。将修改推送到Heroku后,别忘了迁移在线数据库。