好记性不如铅笔头

Django, web, 编程

Django自学笔记:视图

最近自学了下Django,这里笔记下学习记录。

备注:

1 学习记录中的代码和资料参考自网络教程【 http://djangobook.py3k.cn/2.0/ 】和【 http://www.djangobook.com/en/2.0/ 】,版权归原作者所有。
2 小弟第一次接触到Django,本笔记可能有错误,还请各位路过的大牛们给予指点。
3 由于教程年代比较久远了,而且Django不同版本改动很大,这里作者的学习笔记是基于【 python2.7.8 + django1.6.5 】实现的。
4 由于时间关系,学习记录里有的地方记得比较乱,以后有时间再整理下吧。 

静态URL:

首先在目录下新建一个文件【 MyViewControllers.py 】,内容如下:

from django.http import HttpResponse
def showhello(request):
    return HttpResponse("Hello world");

然后修改下【 urls.py 】,将访问路径showhello路由至指定目录。
由于文件夹关系较乱,这里贴下截图:

搞定之后,无需重启Django,Django会自动检测代码变更,直接访问【 http://127.0.0.1:8000/showhello/http://127.0.0.1:8000/showhello/ 】,可以看到效果了。

注意这里的正则表达式解析:‘^showhello/$’,即必须以showhello/ 结尾。如果正则表达式为r’^showhello/’,不带【 $ 】,那么表示只要含有【 showhello/ 】即可。比如http://127.0.0.1:8000/showhello/1 或者http://127.0.0.1:8000/showhello/ddd 或者http://127.0.0.1:8000/showhello/ 都可以访问。
关于这个正则表达式,教程解释如下:

Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。 这意味着我们为/hello/写URL模式不用包含斜杠(/)。
模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。最好还是用范例来说明一下这个概念。 如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。你大多数的URL模式会以^开始、以$结束,但是拥有复杂匹配的灵活性会更好。
你可能会问:如果有人申请访问/hello(尾部没有斜杠/)会怎样。 因为我们的URL模式要求尾部有一个斜杠(/),那个申请URL将不匹配。 然而,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的,参见附件D。)
如果你是喜欢所有URL都以’/’结尾的人(Django开发者的偏爱),那么你只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”. 如果不喜欢URL以斜杠结尾或者根据每个URL来决定,那么需要设置”APPEND_SLASH”为”False”,并且根据你自己的意愿来添加结尾斜杠/在URL模式后.

备注:

看网络教程时,发现很多人栽倒在了目录和import上。这里作者笔记下自己的看法,可能有错误~~:
打开【 D:\Documents\pythons\HelloDjango\HelloDjango 】下的settings.py文件,有如下内容:

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

通过注释我们可以知道,原来该工程的根目录【BASE_DIR 】是【 D:\Documents\pythons\HelloDjango\ 】,即settings.py所在目录的上一层目录,同时也是manage.py的所在目录。因此,这里从项目根目录以及【 python manage.py runserver 】的视角来看,MyViewControllers.py的路径为【 HelloDjango.MyViewControllers 】,即import时的绝对路径。

动态URL:

urls.py中增加URL解析:

url(r'^shownum/(\d+)/(\d+)/$', shownum),

MyViewControllers.py中增加函数:

def shownum(request, firstNumStr, secondNumStr):
    res = "NumInput 1st:" + firstNumStr + " 2nd:" + secondNumStr;
    return HttpResponse(res);

这里注意有两个正则表达式解析,解析值会对应于shownum的参数。如下图:

然后我们可以访问地址看下效果:

如何简单调试Django:

如果我们想调试下shownum怎么实现呢,很简单,在return语句之前加上一句【 assert False; 】,即让强制让程序出错。刷新页面如下图:

可以看到,里面的信息是非常丰富的,非常利于debug。

备注:

1 捕获值可以认为是字符串类型。
2 教程网址上的评注很有意思,这里截取几个开心下~:

Leave a Reply

9 + 17 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据