经过前几篇的介绍,我们以及能够建立简单的网站页面,那如果嫌弃网站页面简陋,那我们就必须要为他加上样式来渲染网络页面,在Django中,我们把这些文件统称为"静态文件"。在规模比较大的项目--特别是由好几个应用组成的大项目中,处理不同应用所需要的静态文件的工作就显得有些麻烦了。而django.contrib.staticfiles
将各个应用的静态文件统一收集起来,这样一来,在生产环境中,这些文件就会集中在一个便于分发的地方。
首先,在应用demo_app
目录下创建一个名为static
的目录,Django 将在该目录先查找静态文件,这种方式和 Django在demo_app/templaes
目录下查找 template 的方式类似。
在你刚新建的 static
文件夹中创建一个名为demo_app
的文件夹,再在demo_app
中创建一个名为style.css
的文件,这样,你的样式路径就应该为demo_app/static/demo_app/style.css
。
类似于管理模板文件,我们同样可以把样式文件直接放入到
demo_app/static
文件夹中--而不是创建另一个demo_app
的子文件夹,这样做的弊端就是因为Django只会使用第一个找到的静态文件,如果你在其他应用中有一个相同名字的静态文件,Django 将无法区分它们。所以我们需要指引Django选择正确的静态文件,最简单的方式就是把它们放入各自的命名空间,也就是把这些静态文件放入另一个与应用名相同的目录中。
将以下样式代码放入到样式表中demo_app/static/demo_app/style.css
input {
width: 320px;
height: 24px;
border: 1px solid #999;
border-radius: 4px;
}
下一步,在demo_app/templates/demo_app/add.html
头文件中添加以下内容
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'demo_app/style.css' %}">
•{% static %}
模板标签会生成静态文件的绝对路径。经过上面简单的操作,我们就能看到页面效果了。启动服务(如果正在运行中,重启一次),会看到如下效果(样式比较丑)。
add_css.png
这边只是对页面做了简单的样式改变,旨在说明Django是如何添加样式的,实际项目中样式会复杂的多!
按照Django的要求,Django应用的测试应该写在应用的test.py
文件中,测试系统会自动的在所有以 tests 开头的文件里寻找并执行测试代码。
在'/demo_app/tests.py'文件中编写如下代码
class CatModelTest(TestCase):
def test_get(self):
cats = Cat.objects.all()
print("111---"+ str(len(cats)))
cat = Cat()
cat.name ='test'
cat.age =12
cat.save()
cats = Cat.objects.all()
print("222---"+ str(len(cats)))
self.assert_(cat.name == 'test1', "名字不匹配")
运行 python manage.py test demo_app
我们会看到如下运行日志
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
111---0
222---1
Destroying test database for alias 'default'...
Failure
Traceback (most recent call last):
File "/Users/zhangcheng/demo_porj/demo_app/tests.py", line 16, in test_get
self.assert_(cat.name == 'test1', "名字不匹配")
AssertionError: False is not true : 名字不匹配
Process finished with exit code 1
我们在测试代码中新增了一个cat对象,Django 会为测试代码自动创建一个临时数据库,当测试代码运行结束后,会自动删除,所以,我们测试代码不会对真实数据库有任何影响。
当我们完成一个视图的功能开发后,为了验证该功能是否完善,我们得启动服务,打开相对应的网页才能看到功能是否符合我们的预期,这样就显得有点繁琐。Django 为了方便我们测试,提供了django.test.Client
类,它可以充当一个虚拟的网络浏览器发挥以下作用(参考django 文档):
•模拟URL上的GET和POST请求并观察响应-从低级HTTP(结果标头和状态代码)到页面内容,应有尽有。•查看重定向链(如果有),并在每个步骤检查URL和状态代码。•测试给定的请求是否由给定的Django模板以及包含某些值的模板上下文呈现。我们可以进入 Django shell 中进行简单的测试,也可以在没用应用中自带的tests.py
文件中进行测试。在shell 中测试必须要进行一些额外的环境配置,所以不推荐,我们还是以在 tests.py
中进行测试为例。
在tests.py
文件中编写如下代码:
from django.test import Client
def test_get(self):
client = Client()
response = client.get('/demo_app/')
print(response.content)
print(response.status_code)
运行 python manage.py test demo_app
我们会看到如下运行日志
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
b'<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta charset="UTF-8">\n <title>Cat List</title>\n</head>\n<body>\n <table border="1">\n <tr>\n <td>Id</td>\n <td>Name</td>\n <td>age</td>\n </tr>\n \n <p>No cat</p>\n \n </table>\n\n</body>\n</html>'
200
Destroying test database for alias 'default'...
Process finished with exit code 0
我们通过 client.get('/demo_app/')
发送了一个get请求,通过返回结果的response.content
和 response.status_code
分别返回了响应内容 和 响应结果代码。那么 ,post 请求该如何发起呢,有兴趣的同学可以尝试下。