最近在学习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笔记 —— 视图的更多相关文章

  1. Django笔记--视图

    URLconf 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对象包括: 正则表达式 视图函数 名称n ...

  2. 【笔记】Django的视图

    [笔记]Django的视图 Python Django  Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应 ...

  3. Django笔记 —— Admin(Django站点管理界面)

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  4. Django笔记 —— 模型

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  5. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  6. 【Django】 视图层说明

    [Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...

  7. Django基本视图

    Django基本视图 下面这三个类也许不能提供项目所需的所有的功能,这些应用于基于类的视图或Mixins情形下. 大多数Django的内建视图继承于其他基于类的视图或者各种mixins中,因为继承链是 ...

  8. Django之视图

    Django之视图   Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个 ...

  9. Django通用视图APIView和视图集ViewSet的介绍和使用

    原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630   1.APIView DRF框架的视图的基类是 ...

随机推荐

  1. 模拟水题,牛吃草(POJ2459)

    题目链接:http://poj.org/problem?id=2459 题目大意:有C头牛,下面有C行,每头牛放进草地的时间,每天吃一个草,总共有F1个草,想要在第D的时候,草地只剩下F2个草. 解题 ...

  2. jade在命令行实时编译

    jade文件: doctype html html head title jade study body h1 imoock jade study 在jade文件夹下,终端输入 jade index. ...

  3. 机器学习实战之Logistic回归

    Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. ...

  4. python_5_password

    #1.python2中raw_input与python3中的input是相同的,python2中也有input但是别用(不好用,忘记它) #密码是明文的 username=input("us ...

  5. PMVS论文随笔(1)

    博客园排版系统真的比较挫,可以访问我的github.io阅读 关于Unit的概念 在pmvs的源代码中,有一个函数是getUnit ,其函数如下(在PMVS2的windows版本代码,optim.cc ...

  6. base_lr, blobs_lr

    caffe里面,原来以为是不可以随便调整学习率的,现在看来是可以的.base_lr是适用于所有层的学习率,而针对单个层,可以通过增加两个blobs_lr,用来调整该层的学习率,为什么是两个呢,因为一个 ...

  7. Maven学习总结(10)

    本文通过一个例子来介绍利用maven来构建一个多模块的jave项目.开发工具:intellij idea. 一.项目结构 multi-module-project是主工程,里面包含两个模块(Modul ...

  8. 时间戳与QDateTime相互转换

    最近项目中需要将日期时间输出到Excel中,程序使用Qt开发,使用第三方库QtXlsx进行Excel读写操作.Excel中第一列为时间,时间间隔为1小时,如图所示. 赋值起始时间stDTime,则后续 ...

  9. django+xadmin在线教育平台(七)

    4-3 新建项目 Python2.7 创建虚拟环境. mkvirtualenv mxonline2 安装django pip install django==1.9.8 注意Python2下此处必须用 ...

  10. datatable 默认按某字段排序

    "columns": [ { data: null}, { data: 'name'}, { data: 'birthday'} ], "order": [[ ...