Django blog

来源:互联网 发布:2015网络热词 编辑:程序博客网 时间:2024/05/22 16:51

Django 处理 HTTP请求

Web 应用的交互过程其实就是 HTTP 请求与响应的过程:

  1. 打开浏览器,在地址栏输入想访问的网址,比如 http://zmrenwu.com/
  2. 浏览器把访问意图包装成一个 HTTP 请求,发给想要访问的网址所对应的服务器,然后再做出回应
  3. 服务器处理了HTTP 请求,然后生成一段 HTTP 响应给浏览器。浏览器解读这个响应,把相关的内容在浏览器里显示出来,于是我们就看到了网站的内容

比如你访问了 http://zmrenwu.com/,服务器接收到这个请求后知道用户访问的是首页,首页显示的是全部文章列表,于是它从数据库里把文章数据取出来,生成一个写着这些数据的 HTML 文档,包装到 HTTP 响应里发给浏览器,浏览器解读这个响应,把 HTML 文档显示出来,可以看到文章列表的内容

 

因此,Django 作为一个 Web 框架,它的使命就是处理流程中的第二步。即接收浏览器发来的 HTTP 请求,返回相应的 HTTP 响应。于是引出这么几个问题:

  1. Django 如何接收 HTTP 请求?
  2. Django 如何处理这个 HTTP 请求?
  3. 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 中写的 URLr'^$',即一个空字符串。那么 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 - 博客首页》

 

 

原创粉丝点击