这部分我们会先说说基础模板和主页的模板继承。

然后,我们将讨论一般站点都会用到的一些配置文件。

robots.txt在项目初期很重要,因为这时你是不会希望Google索引你的网页的。想象一下用户在用Google搜索东西的时候,不经意间进入到你正在开发的网站,而网站此时不堪的CSS样式和一些无意义的文本被用户看到后可能发生的事吧!

另外,你将会学到如果在你的测试中使用Coverage这个工具。你可能已经知道,这个工具可以帮你衡量你的代码有多少已经测试过了。

本部分的概览:


在开始本部分之前顺便问一下,我们之前所写的测试在你这是否都通过了呢? :-)

模板继承

在上一部分中,我们已经让index.html继承了base.html的文件内容。然而,这俩文件唯一不同的内容就是标题。

让我们把base.html变得更灵活一些吧。你可以在这找到这些文件最近的版本:base.htmlindex.html

我们在head标签中加入下面两个代码块:

1
2
{% block head_css %}{% endblock %}
{% block head_javascript %}{% endblock %}

这使得我们的模板可以包含更多的cssjavascript文件。下一步,我们将给classnavbardiv加上一个navbar的代码块:

1
2
3
4
5
{% block navbar %}
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
...
</div>
{% endblock %}

这样,我们就可以替换掉我们模板里面navbar的内容了,但如果我们不指定,这个navbar默认会显示。

主要的内容应该放在一个名为block的单独的内容块里。然而,由于我们默认不需要任何内容,我们将把jumbotroncontainer这些divs里面的内容全部剪切至index.html中。这样index.html就成了下面这个样子了:

1
2
3
4
5
6
7
8
9
10
11
12
{% extends "base.html" %}

{% block head_title %}TaskBuster Django Tutorial{% endblock %}

{% block content %}
<div class="jumbotron">
...
</div>
<div class="container">
...
</div>
{% endblock %}

而在base.html中,你只需要添加上这段代码:

1
{% block content %}{% endblock %}

最后,footer也需要一些脚本,让我们把这些加上:

1
{% block footer_javascript %}{% endblock %}

保存一下这些文件然后运行测试。应该来说主页看起来跟之前会是一样的,并且所有的测试应该会通过!

Robots.txt和humans.txt

通常搜索引擎会搜索下面两个文件所指定的内容:

那我们先让这些文件能通过url发现吧。如你所猜想的一样,开始之前,我们将为它们创建一个功能测试。:-)

打开functional_tests/test_all_users.py文件,在HomeNewVisitorTest类中添加下面的测试函数:

1
2
3
4
5
def test_home_files(self):
self.browser.get(self.live_server_url + "/robots.txt")
self.assertNotIn("Not Found", self.browser.title)
self.browser.get(self.live_server_url + "/humans.txt")
self.assertNotIn("Not Found", self.browser.title)

它会测试当我们打开相应的url时,我们应该不会看到Not Found的404页面(如果在你这儿当页面找不到时,你的浏览器显示了一条不同的消息,那么你应该把你的测试文本改成这条消息内容)。

运行测试,看看它失败的内容。下一步,更新你的urls.py

1
from .views import home, home_files

以及:

1
2
3
4
5
6
urlpatterns = patterns(
...
url(r'^(?P<filename>(robots.txt)|(humans.txt))$',
home_files, name='home-files'),
...
)

这是一个正则表达式,它接收我们想要的urls,并传递一个文件名的参数,例如,robots.txt或者humans.txt

接下来,编辑views.py,加入相应的home_files视图:

1
2
def home_files(request, filename):
return render(request, filename, {}, content_type="text/plain")

再次运行测试,现在它们应该会通过!:-)

但是,这些文件该包含些什么内容呢?

当我开发一个网站时,我不希望Google索引我的任何网页。因此,我会在robots.txt中添加下面的内容:

1
User-agent: *
Disallow: /

而在humans.txt中,你应该加上你们团队的信息。例如:

1
# humanstxt.org/
# The humans responsible & technology colophon

# TEAM
    Marina Mele -- Developer -- @marina_mele

# THANKS
    Thanks to all my Blog readers, who encouraged me to write the
    TaskBuster Django Tutorial

# TECHNOLOGY COLOPHON
    Django
    HTML5 Boilerplate
    Twitter Bootstrap

当你的站点正式上线时,你要记得编辑下robots.txt的内容,好让Google可以索引你的页面。否则,用户在使用搜索引擎搜索跟你站点相关的内容时不会得到你的站点信息。

favicon.ico 图片

如果你不知道什么是favicon图片,那么请看下这个页面标签开头的那个球形奶牛图片 :-)

你可能已经发现在taskbuster/static文件夹下已经存在一个favicon.ico文件,但它现在在我们的主页不可见。这是因为我们忘了把它添加到我们的模板中了!

所以请打开base.html模板,在title标签中加入下面的代码:

1
2
<link rel="shortcut icon" href="{% static 'favicon.ico' %}" 
type="image/x-icon">

重新加载页面,你可以在你的页面标签开头看到你的icon

测试代码覆盖工具coverage的使用

Coverage对于测试来说是非常有用的工具。它告诉你你的测试已经覆盖了哪些代码。在上线之前确保你的测试覆盖了大部分代码是非常重要的。

我们只在测试环境中安装它,所以激活tb_test环境,然后运行:

1
$ pip install coverage

使用pip freeze核对一下版本,然后把它添加到requirements/testing.txt

然后,使用Coverage运行你的测试:

1
$ coverage run --source='.' manage.py test

这将同时运行单元测试和功能测试。你可以这样看coverage报告:

1
$ coverage report

如果你希望得到一个html格式的报告,输入:

1
$ coverage html

然后,你可以在htmlcov/index.html中看到你想要的结果了,具体说来你可以看到测试代码覆盖了文件中哪些行!很棒,对吧!

然而,这些命令创建了一些我们不希望放在仓库里的文件。所以这样处理:

1
2
$ echo ".coverage" >> .gitignore
$ echo "htmlcov" >> .gitignore

这就是本部分所有的内容!

在下一部分,我们将讨论国际化。我们将配置两种语言,并让我们的网站在两种语言下都可以运行。

进入下一部分 – 国际化和本地化。多语言以及时区

你喜欢Taskbuster教程吗?如果喜欢,请跟你的朋友们分享它! :-)