Django blog - 05 - 博客首页初创
Django 处理 HTTP请求
Web 应用的交互过程其实就是 HTTP 请求与响应的过程:
- 打开浏览器,在地址栏输入想访问的网址,比如 http://zmrenwu.com/
- 浏览器把访问意图包装成一个 HTTP 请求,发给想要访问的网址所对应的服务器,然后再做出回应
- 服务器处理了HTTP 请求,然后生成一段 HTTP 响应给浏览器。浏览器解读这个响应,把相关的内容在浏览器里显示出来,于是我们就看到了网站的内容
比如你访问了 http://zmrenwu.com/,服务器接收到这个请求后知道用户访问的是首页,首页显示的是全部文章列表,于是它从数据库里把文章数据取出来,生成一个写着这些数据的 HTML 文档,包装到 HTTP 响应里发给浏览器,浏览器解读这个响应,把 HTML 文档显示出来,可以看到文章列表的内容
因此,Django 作为一个 Web 框架,它的使命就是处理流程中的第二步。即接收浏览器发来的 HTTP 请求,返回相应的 HTTP 响应。于是引出这么几个问题:
- Django 如何接收 HTTP 请求?
- Django 如何处理这个 HTTP 请求?
- Django 如何生成 HTTP 响应?
Django 有其一套规定的机制处理这些问题。按照 Django 的规定,就能开发出所需的功能。
Hello视图函数
以 Hello World为例查看 Django处理上述问题的机制
绑定 URL与视图函数
首先 Django需要知道当用户访问不同的网址时,应该如何处理这些不同的网址(即所说的路由)。
Django把不同的网址对应的处理函数写在一个 urls.py文件里,当用户访问某个网址时,Django就去会这个文件里找,如果找到这个网址,就会调用和它绑定在一起的处理函数(叫做视图函数)。
具体步骤:
1)在 blog应用的目录下创建一个urls.py文件
在 blog\urls.py 写入下列代码:
从 django.conf.urls导入了url函数,又从当前目录下导入了 views 模块
网址和处理函数的关系写在了urlpatterns列表里
绑定关系的写法:
把网址和对应的处理函数作为参数传给url函数(第一个参数是网址,第二个参数是处理函数),另外我们还传递了另外一个参数name,这个参数的值将作为处理函数index的别名,以后会用到
注意:网址是用正则表达式写的,Django会用这个正则表达式去匹配用户实际输入的网址,如果匹配成功,就会调用其后面的视图函数做相应的处理
比如说本地开发服务器的域名是http://127.0.0.1:8000,当用户输入网址 http://127.0.0.1:8000 后,Django首先会把协议 http、域名 127.0.0.1 和端口号 8000去掉,此时只剩下一个空字符串,而r'^$'的模式正是匹配一个空字符串(这个正则表达式的意思是以空字符串开头且以空字符串结尾),于是二者匹配,Django便会调用其对应的views.index函数
注意:在项目根目录的 blogproject\目录下(即 settings.py所在的目录),原本就有一个 urls.py文件,这是整个工程项目的 URL配置文件。而新建了一个 urls.py文件,且位于 blog应用下。这个文件将用于 blog应用相关的 URL配置。不要把两个文件搞混了。
编写视图函数
2)实际编写views.index视图函数了,按照惯例视图函数定义在views.py文件里:
Web服务器的作用就是接收来自用户的 HTTP请求,根据请求内容作出相应的处理,并把处理结果包装成 HTTP响应返回给用户
这两行的函数体现了这个过程:首先接受一个名为request的参数,这个request就是 Django 为我们封装好的 HTTP请求,它是类HttpRequest的一个实例。然后直接返回了一个 HTTP 响应给用户,这个 HTTP响应也是 Django帮我们封装好的,它是类HttpResponse的一个实例,只是我们给它传了一个自定义的字符串参数。
浏览器接收到这个响应后就会在页面上显示出我们传递的内容:欢迎访问我的博客首页!
配置项目 URL
Django匹配 URL模式是在 blogproject\目录(即 settings.py文件所在的目录)的 urls.py下的,前面已经建立了一个 urls.py文件,并且绑定了 URL和视图函数index,要把 blog 应用下的 urls.py文件包含到blogproject\urls.py里去
3)把 blog应用下的urls.py文件包含到blogproject\urls.py
打开blogproject/urls.py文件看到如下内容:
修改后:
导入了一个include
函数,把
blog 应用下的urls.py文件包含了进来
r''
,是一个空字符串,可以写其它字符串,Django会把这个字符串和后面
include的 urls.py文件中的
URL拼接
比如把r''
改成r'blog/'
,而在
blog.urls 中写的 URL是r'^$'
,即一个空字符串。那么
Django 最终匹配的就是 blog/加上一个空字符串,即
blog/
运行结果
4)运行python
manage.py runserver
打开开发服务器,在浏览器输入开发服务器的地址http://127.0.0.1:8000/
使用 Django模板系统
以上基本就是 Django的开发流程了,写好处理 HTTP请求和返回 HTTP响应的视图函数,然后把视图函数绑定到相应的 URL上。
模板系统:Django把大段的文本写到一个文件里,然后
Django自己会去读取这个文件,再把读取到的内容传给HttpResponse
。让我们用模板系统来改造一下上面的例子。
->在项目根目录(即 manage.py 文件所在目录)下建立一个名为 templates的文件夹,存放模板。
->在 templates\目录下建立一个名为 blog的文件夹,用来存放和 blog应用相关的模板
->建立这样的文件夹结构的目的是把不同应用用到的模板隔离开来,方便以后维护。模板存放在哪里是无关紧要的,只要 Django能够找到的就好
->templates\blog目录下建立一个名为index.html的文件
强调: templates\目录位于项目根目录,而 index.html位于 templates\blog目录下,而不是 blog应用下,弄错可能会得到一个TemplateDoesNotExist异常。如果遇到这个异常,请回来检查一下模板目录结构是否正确。
->在templates\blog\index.html文件里写入下面的代码:
这是一个标准的 HTML文档,其中,{{
title }}
,{{ welcome }}
是
Django规定的语法。 {{ }}包起来的变量叫做模板变量。Django在渲染这个模板的时候会根据传递给模板的变量替换掉这些变量。最终在模板中显示的将会是我们传递的值。
注意:index.html必须以 UTF-8的编码格式保存,且小心不要往里面添加一些特殊字符,否则极有可能得到一个 UnicodeDecodeError这样的错误。
->在 settings.py文件里设置一下模板文件所在的路径
在 settings.py找到TEMPLATES
选项,内容如下:
其中, DIRS就是设置模板的路径,在 []中写入 os.path.join(BASE_DIR, 'templates'),即,
BASE_DIR 是 settings.py 在配置开头前面定义的变量,记录的是工程根目录 blogproject\ 的值(注意是最外层的 blogproject\ 目录)
这个目录下有模板文件所在的目录 templates\,于是利用os.path.join 把这两个路径连起来,构成完整的模板路径,Django 就知道去这个路径下面找之前创建的模板了
->修改视图函数:
这里不再是直接把字符串传给 HttpResponse 了
调用 Django 提供的 render 函数根据传入的参数来构造 HttpResponse
首先把 HTTP 请求传了进去,然后 render 根据第二个参数的值 blog/index.html 找到这个模板文件并读取模板中的内容
之后 render 根据传入的 context 参数的值把模板中的变量替换为传递的变量的值,{{ title }} 被替换成了 context 字典中 title 对应的值,同理 {{ welcome }} 也被替换成相应的值
最终, HTML 模板中的内容字符串被传递给 HttpResponse 对象并返回给浏览器(Django 在 render 函数里隐式地帮我们完成了这个过程),这样用户的浏览器上便显示出了我们写的 HTML 模板的内容
下一章《Django blog - 06 - 博客首页》