Django笔记 —— 视图
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过。Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧~
本篇笔记(其实我的所有笔记都是),并不会过于详细的讲解。因此如果有大家看不明白的地方,欢迎在我正版博客下留言,有时间的时候我很愿意来这里与大家探讨问题。(当然,不能是简简单单就可以百度到的问题-.-)
我所选用的教材是《The Django Book 2.0》,本节是视图部分,对应书中第三章。
------------------------------------------------------------------------------------------------------------------------------------------------
0、视图部分代码(先给出代码方便大家看,后面一一解释)
在上节的基础上(创建一个网站qiqisite,代码是django-admin.py startproject qiqisite),修改urls.py和views.py。
urls.py
from django.conf.urls import include, url
from django.contrib import admin
from qiqisite.views import * urlpatterns = [
# Examples:
# url(r'^$', 'qiqisite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')), # url(r'^admin/', include(admin.site.urls)),
url('^$', homepage),
url('^hello/$', hello),
url('^time/$', current_datetime),
url(r'^time/plus/(\d{1,2})/$', hours_ahead),
]
views.py
from django.http import Http404, HttpResponse
import datetime
import time def hello(request):
return HttpResponse("Hello world") def homepage(request):
return HttpResponse("Homepage -- I'm qiqi.") def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>"
html += "time_UTC = %s.<br/>" % now
html += "time_UTC = %s.<br/>" % time.ctime()
html += "time_UTC+8 = %s.<br/>" % (now + datetime.timedelta(hours=8))
html += "time_UTC+8 = %s.<br/>" % (time.asctime(time.localtime(time.time() + 3600 * 8)))
html += "</body></html>"
return HttpResponse(html) def hours_ahead(request, offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
#assert False
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)
当我们运行服务器(python manage.py runserver)后,便可以用访问到下列网页了:
| 网页 | 网址 | 内容 |
| A | http://127.0.0.1:8000/ | "Homepage -- I'm qiqi." |
| B | http://127.0.0.1:8000/hello/ | "Hello World" |
| C | http://127.0.0.1:8000/time/ | 当前时间 |
| D | http://127.0.0.1:8000/time/plus/num/ | 当前时间+num小时(num必须是1~99之间的一个正整数) |
1、静态视图
所谓静态视图,顾名思义,就是网页内容是静态的,随时打开内容都一样。本例子中,A、B都属于静态视图。
我们首先以网页B为例,说明Django显示网页的实际步骤:
1. 发现地址为/hello/
2. Django找到settings.py中的ROOT_URLCONF的值(本例子中为mysite.urls),定位到URLconf(即urls.py)
3. Django在URLconf内所有URL模式中,找到第一个匹配/hello/的条目,找不到则报错
4. 调用相应的视图函数(本例子中即views.py中的hello函数)
5. 视图函数返回一个HttpResponse
6. Django将HttpResponse转换为一个对应的HTTP response(详见本书附录H,“HTTP请求(Request)与回应(Response)对象”,http://djangobook.py3k.cn/appendixH/),以网页的形式显示出来(这里大家不妨从浏览器中查看一下网页B的源代码,会发现不只有我们写进去的"Hello world",还自动为我们加上了<html><head><body>三组标签,从而构成了一个html网页)
这过程很好理解,因此,如果我们需要在网站中加一个页面,那么我们应当做以下几步(其顺序能体现出你的思路):
| 1. 在urls.py的urlpatterns列表中加入一项 | url('^pagename/$', onepage) |
| 2. 在views.py中写出对应函数 |
def onepage(request): return HttpResponse("a new page") |
| 3. 在urls.py中import此函数 | from qiqisite.views import onepage |
| 4. 可以访问此页面了 | http://127.0.0.1:8000/pagename/ |
如此一来,我们便可以生成一个静态页面了。(关于'^pagename/$'的详细解释,本文后面“正则表达式”处会讲,先不急)
至于网页A,则向大家展示了如何使用直接让网站的根http://127.0.0.1:8000/成为可以访问的网页,但书中说,此方法并不常用,我并不知道为什么,欢迎大家与我交流。
2、动态视图
这里所说的动态视图,是指网页显示的内容会随时不同,最简单的例子莫过于显示时间了。
因此这里使用python的函数,做了显示当前时间的网页C。
又从正则表达式中提取数据,做了可以显示一组时间的一组网页D。
3、正则表达式
正则表达式内容很多,此处并非专题,因此仅介绍其基本内容。
| 符号 | 匹配 | 例子 | 备注 |
| . | 一个字符 | ||
| \d | 一个数字 | 一个数字,自然不能加负号 | |
| [A-Z] | 一个大写字母 | ||
| [a-z] | 一个小写字母 | ||
| [A-Za-z] | 一个字母 | ||
| + | 一个或多个相应字符 | \d+,匹配一个或多个数字 | |
| [^x]+ | 一个或多个不为x的字符 | [^/]+,匹配一个或多个不为/的字符 | |
| ? | 零个或一个相应字符 | \d?,匹配零个或一个数字 | |
| * | 任意个相应字符 | \d*,匹配任意个数字 | “任意个”表示“零个或一个或多个” |
| {x,y} | x~y个相应字符 | \d{1,3},匹配1~3个数字 | 必须满足x<=y,否则表达式不合法 |
| () | 从文本中提取数据 | (\d{1,2}),匹配1~2个数字 | |
| ^ | 表达式与字符串的前缀相匹配 | ^hello/,匹配任何以hello/开头的字符串 | |
| $ | 表达式与字符串的后缀相匹配 | hello/$,匹配任何以hello/结尾的字符串 | |
| …… | …… | …… | …… |
现在,之前并不了解正则表达式的读者应该可以看懂前面urls.py中的正则表达式了。
还有两点需要在此说明:
1. 在Django中,如果你写的网址中没有最后的/,也会自动帮你加上。书中说,这设置体现在settings.py中的APPEND_SLASH参数,详见书中附录D。但我却并未找到此参数,想来是新版本有所改动,我手动测试过,Django依旧会自动把网址中没有/的给你加上的。
2. Django在检查URL模式(即你在urls.py中写的那些正则表达式,例如"^hello/$")时,会自动移除开头的/。因此,我们只需要写成hello/,而不需要写成/hello/。
3. 书中有这样一段原文:“你可能会认为用一系列正则表达式将URLs映射到函数也许会比较慢,但事实却会让你惊讶。”
4、Django时区
Django是有时区设定的,大家可以打开settings.py,看看里面的TIME_ZONE参数,默认值应该是'UTC'。
关于时区的内容,过于繁杂,我这里不多赘述。仅仅说明,UTC表示美国标准时间,而世界被分为24时区,中国标准时间是美国标准时间加上8小时,因此也简称UTC+8。但是,这里并不能简单地把参数改为UTC+8,Django是无法识别的。中国标准时间应当如何修改参数,我并未查到一个满意的答案,这里仅仅是把时间手动+8来得到的。欢迎了解的同学赐教!
5、用报错界面调试
Django自带的报错界面很棒,可以用来调试。
这里用网页D来说明。大家可以把views.py中网页D对应的函数(即hours_ahead)修改两处,得到以下错误:
| 修改方法 | 得到错误 |
| 将offset=int(offset)改为pass | 类型错误(在26行为dt赋值时,timedelta函数内参数不能是字符串类型) |
| 将27行注释去掉 | 咱们自己抛出的错误-.-|| |
这时,大家从浏览器中打开网页D,自然会看到报错页面。
这个页面,大家不妨仔细看看。我仅仅给出简单提示:
1. Trackback中,有5处都是可以点的。
2. 随着你知识的积累,Request Information中的信息可能会越来越有用。
3. 你有没有想到,利用Trackback中对于Local vars的显示,我们可以在追踪调试时,把嵌入代码中的众多print,改为寥寥几条assert False?
------------------------------------------------------------------------------------------------------------------------------------------------
至此,“视图与URL配置”简介完成,下一节是“模板”。
Django笔记 —— 视图的更多相关文章
- Django笔记--视图
URLconf 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对象包括: 正则表达式 视图函数 名称n ...
- 【笔记】Django的视图
[笔记]Django的视图 Python Django Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应 ...
- Django笔记 —— Admin(Django站点管理界面)
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Django笔记 —— 模型
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- 【Django】 视图层说明
[Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...
- Django基本视图
Django基本视图 下面这三个类也许不能提供项目所需的所有的功能,这些应用于基于类的视图或Mixins情形下. 大多数Django的内建视图继承于其他基于类的视图或者各种mixins中,因为继承链是 ...
- Django之视图
Django之视图 Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个 ...
- Django通用视图APIView和视图集ViewSet的介绍和使用
原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630 1.APIView DRF框架的视图的基类是 ...
随机推荐
- 概念:详细讲解url和路由概念
例如:一个网址为 http://www.abc.com/aa 定义:/aa = bb/cc/dd 那么:http://www.abc.com/aa就是一个url,那么我们可以得出:网址=url 而当我 ...
- RF脚本中的坑1: SyntaxError: invalid token
话不多说,直接上调试脚本: 执行后${b}=8:没问题.然后${a}改成08继续: 执行后居然报错了: 经过多次尝试08或者09时,都会报SyntaxError错误:后来查阅语法,才恍然大悟:Pyth ...
- ie6下按钮下边框消失不显示的问题
最近网站做改版,又发现一个ie6奇葩的问题,就一个很普通带边框的按钮,但在ie6中下边框不显示,ie7没有测试不知道是不是也不显示,其他浏览器正常 代码和预览效果如下: <style> b ...
- vuejs使用组件的细节点
is属性 <div id='root'> <table> <tbody> <row></row> <row></row&g ...
- Android检查更新(是否强制更新)
Android应用客户端通常会需要更新,而且根据需求分为普通更新和强制更新.是否强制更新可通过检查更新时从服务器获取的标志位来判断. public class UpdateManager { priv ...
- MySQL 主从同步 Slave_IO_Running: No
MariaDB [chen]> show slave status \G *************************** 1. row ************************* ...
- 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列
第35章 WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- 前端面试题(来自前端网http://www.qdfuns.com/notes/23515/c9163ddd620baac5dd23141d41982bb8.html)
HTML&CSS 1. 常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1)浏览器:IE,Chrome,FireFox,Safari,Opera. (Q2)内核:Trid ...
- JT796、JT808、JT809、JT1076、JT1077、JT1078部标平台过检道路运输车辆卫星定位系统企业视频监控平台检测登记表
道路运输车辆卫星定位系统企业视频监控平台检测登记表的具体格式如下: 报名检测需要以下材料: 0检测报名须知.doc 点击下载 1检测意向单.doc 点击下载 2-1道路运输车辆卫星定位系统企业 ...
- babel 不能统编译Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise的问题
Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator.Generator.Set.Maps.Proxy.Reflect.Symbol.Promis ...