blog首页视图
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用
django 是如何处理 http 请求的
web应用的交互过程其实就是http请求和响应的过程,我们使用浏览器上网流程大致上是这样的:
- 我们打开浏览器,在地址栏输入我们想访问的网址,比如 www.djangoproject.com(当然你也可能从收藏夹里直接打开网站,但本质上都是一样的。)
- 浏览器知道我们要访问那个网址后,它在后台帮我们做了很多事,主要就是把我们的访问以图包装成一个http请求,发给我们想要访问的网址所对应的服务器,通俗点将就是浏览器帮我们通知网站的服务器,说有人来访问你了,访问的请求都写在了http里了,你按照要求处理后告诉我,我再帮你回应
- 网站服务器处理了http请求,然后生成一段http响应给浏览器,浏览器解读这个响应,把相关内容在浏览器里显示出来,于是我们就看到了网站的内容
因此,django 作为一个 web 框架,它的使命就是处理流程中的第二步,接收浏览器发来的 http 请求,返回相应的 http 响应。于是引出这么几个问题:
- django 如何接收 http 请求?
- django 如何处理这个 http 请求?
- django 如何生成 http 响应?
对于如何处理这些问题,django 有其自身的一套规定的机制。我们按照 django 的规定,就能开发出我们所需的功能。我们先以一个最简单的 hello world 为例来看看 django 处理上述问题的机制是怎么样的。
首先 django 需要知道当用户访问不同的网址时,应该如何处理不同的网址。django 的做法是把不同的网址对应的处理函数写在一个 urls.py 文件里,当用户访问某个网址时,django 就去会这个文件里找,如果找到这个网址,就会调用和它绑定在一起的处理函数(叫做视图函数),下面是具体的做法,首先在 blog 应用的目录下创建一个 urls.py 文件,这时你的目录看起来是这样:
blog/
__init__.py
admin.py
apps.py
migrations/
0001_initial.py
__init__.py
models.py
tests.py
views.py
urls.py # 新建的文件
在urls.py写入这些代码
from django.conf.urls import url
from . import views urlpatterns = [
# 第一个参数是网址,第二个是处理函数
url(r'^$', views.index, name='index')
]
我们首先从django.conf.urls 导入了url函数,从当前目录导入了views模块,然后我们把网址和处理函数的关系卸载了urlpatterns列表里。绑定关系的写法是把网址和对应的处理函数作为参数写给url函数,另外传递了一个name参数,这个参数的值将作为处理函数index的别名,这在以后会用到
注意这里我们的网址是用正则写的,django会用这个正则去匹配用户实际输入的网址,如果匹配成功就会调用后面的视图函数做相应的处理,比如说我们本地开发服务器的域名是 127.0.0.1:8000,那么当用户输入网址:127.0.0.1:8000 后,django 首先会把域名(即 127.0.0.1)和端口号(8000)去掉,此时只剩下一个空字符串,而 r'^$' 的模式正是匹配一个空字符串(这个正则表达式的意思是以空字符串开头且以空字符串结尾),于是二者匹配,django 便会调用其对应的 views.index 函数。
第二步就是实际编写我们的views.index视图函数了,卸载views.py文件里:
from django.shortcuts import render
from django.http import HttpResponse # Create your views here. def index(request):
return HttpResponse('Welcome to my blog home!')
前面说过,web服务器的作用就是接收来自用户的http请求,根据请求内容做出相应的处理,并把处理结果包装成http响应返回给用户,这个两行的函数体现了这个过程,它首先接受了一个request参数,这个request就是django为我们封装好的http请求,他是类httpresponse的一个实例,然后我们便直接返回了一个http响应给用户,这个http响应也是django帮我们封装好的,也是类httpresponse的一个实例,只是我们给它传了一个自定义的字符串,用户接受到这个响应后就会在浏览器显示出我们传递的内容'Welcome to my blog home!'
还差最后一步,我们前面建立了一个urls.py文件,并且绑定了url和视图函数index,但是django并不知道,django匹配url是在NewprojectBlog的urls.py下的,所以我们要把我们自己写的urls.py文件包含到这个文件里去
打开这个文件我们看到以下内容
"""NewBlogProject URL Configuration The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
. Add an import: from my_app import views
. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
. Add an import: from other_app.views import Home
. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
. Import the include() function: from django.conf.urls import url, include
. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
]
我们在urlpatterns列表中加入url(r'', include(blog.urls)),include方法需要导入,写from django,conf.urls import include
include函数把blog应用下的urls.py包含了进来,此外include前面还有一个r'‘,这是一个空字符串,这里也可以写成其它的字符串,django会把这个字符串和后面include包含的urls.py文件里的url拼接,例如我们把这里的r'‘改成r'blog/',而我们在blog.urls中写的url是r'^$'一个空字符串,那么django最终匹配的就是blog/加上一个空字符串
这基本上就是django的开发流程了,写好处理http请求和返回http响应的师徒函数,然后把视图函数绑定到相应的url上,但是我们在视图函数中返回的是一个HTTPResponse类的实例,我们给他传入了一个我们希望显示在用户浏览器上的字符串,但是我们的blog不可能只显示一句话,它有可能会显示很长很长的内容,比如我们发布的博客文章列表,或者一大段的博客文字,我们不能每次都把这些大段段的内容传递给HTTPResponse,于是django对这个问题提供了一个好方法,叫做模版系统,django要我们把大段的文本写到一个文件里,然后自己会去读取这个文件,django再把读取到的内容传递给HTTPResponse,我们用模版系统来改造一下上面的例子。在项目目录里有一个templates的文件夹,用来存放我们的模版,然后再建立一个blog文件夹,用来存放blog应用相关的模版,淡然存放在那里不重要,只要django找的到就行,但是这样建立的目地是把不同应用用的模块分离开来,方便维护,然后在新建的blog下建立一个index.html文件,写下代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ welcome }}</h1>
</body>
</html>
这是一个标准的html文档,只是里面有两个比较奇怪的地方,{{title}}和{{welcome}},这是django规定的语法,用{{}}包起来的叫做模版变量,django在读取这个模版的时候会根据我们传来的值替换这些变量,最终在模版中显示的将会是我们传递的值。
模版写好了还得告诉django去那里找模版,在settings.py文件里设置一下模版文件的路径,找到TEMPLATES选项,
blogproject/settings.py TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
其中的DIRS就是设置模版的路径,写入os.path.join(BASE_DIR, 'templates')
这里的BASE_DIR是settings.py前面定义的变量,记录的是工程目录newprojectblog的值。在这里目录下有我们的模版目录templates,于是利用os.path.join把两个路径连起来,构成完整的模版路径,django就知道去这个路径下面找我们的模版
视图函数可以改一下了
from django.shortcuts import render
from django.http import HttpResponse # Create your views here. def index(request):
return render(request, 'blog/index.html', context={'title': 'My blog home', 'welcome': 'Welcome to my blog!'})
这里我们不在是把字符串传递给HttpResponse了,而是调用django提供的 render函数,这个函数根据我们传入的参数来构造HttpResponse,我们首先把http请求传了进去,然后它根据第二个参数的值blog/index.html找到我们的模版,然后读取模版的内容,并且根据我们传入的context把模版中的变量替换成我们传递的值,{{ title }} 被替换成了 context 字典中 title 对应的值,同理 {{ welcome }} 也被替换成相应的值。最终,我们的 html 模板中的内容字符串被传递给 HttpResponse 对象并返回给浏览器,这样用户的浏览器上便显示出了我们写的 html 模板的内容。
blog首页视图的更多相关文章
- django博客项目5:博客首页视图(2)
真正的 Django 博客首页视图 在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应.不过我们仅仅 ...
- django博客项目4:博客首页视图(1)
Web 应用的交互过程其实就是 HTTP 请求与响应的过程.无论是在 PC 端还是移动端,我们通常使用浏览器来上网,上网流程大致来说是这样的: 我们打开浏览器,在地址栏输入想访问的网址,比如 http ...
- Django 博客首页视图
Django 处理 HTTP 请求 Web 应用的交互过程其实就是 HTTP 请求与响应的过程.无论是在 PC 端还是移动端,我们通常使用浏览器来上网,上网流程大致来说是这样的: 我们打开浏览器,在地 ...
- blog真正的首页
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上一节我们阐明了django的开发流程, ...
- 再次用CodeIgniter实现简易blog
天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能.所以,老PHPer ...
- Django 基于类的通用视图
在早期,我们认识到在视图开发过程中有共同的用法和模式.这时我们引入基于函数的通用视图来抽象这些模式以简化常见情形的视图开发. 基于函数视图的用法有以下三种: def index(request): r ...
- [python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情
回顾一下开发流程:配置url, 编写视图函数,编写对应模板 配置URL 首页视图匹配的 URL 去掉域名后,是一个空的字符串.每篇文章的详情有着不同的 URL,因此可以设计文章详情页面URl:< ...
- [python][django学习篇][9]设计正在博客视图(3)
需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...
- Django blog项目知识点总结
数据库操作部分 当我们在Django项目中的models.py下写好创建表的代码后.为了创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py.激活虚拟环境,切换到 manage.py ...
随机推荐
- Mockito 如何 mock 返回值为 void 的方法
转载:https://unmi.cc/mockito-how-to-mock-void-method/#more-7748 最初接触 Mockito 还思考并尝试过如何用它来 mock 返回值为 vo ...
- C 作用域规则
C 作用域规则 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函 ...
- kohana nginx的配置
kohana nginx的配置 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php? kohana_uri=/$1 ...
- 【Excle数据透视】如何创建多条件汇总的数据透视表
创建多条件的数据透视表,源数据如下: 插入数据透视表 根据需求拖拽字段(统计该地区下销售人员销售业绩) 数据透视结果 数据透视表布局的各个区域说明 区域 说明 数值 用于显示汇总值数据 行标签 用于将 ...
- .net 定时执行 windows 服务
1.新建项目 --> Windows 服务 2.Service1.cs代码 using System; using System.Collections.Generic; using Syste ...
- openstack 用nova API 指定 compute node 创建 instance
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- 【ORACLE】ORA-27102: out of memory报错的处理
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- HDOJ2084数塔问题
数塔问题 题目要求从顶层走究竟层.若每一步仅仅能走到相邻的结点,求经过的结点的数字之和最大值. 非常经典的DP,能够这样考虑,要求从塔顶到塔底最大路径之和.计算时能够考虑自底向上,走最后一步所选的数一 ...
- 【7.1.1】ELK集群搭建 之 ES集群
写在前边 昨天晚上就已经完成这篇博客了,就是在测试这块是否正常跑起来,晚上没搞完,上班前把电脑关机带着,结果没保存!基本上昨天写的东西都丢了,好在博客园的图片url还在. 为了让大家都轻松些,我轻松写 ...
- WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where applicable(附编译脚本)
WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where appli ...