15325@qq.com
|
2.0/chapter03/#456 |
2009-10-23 16:55:29
|
请留意:如果你在一个不能转换成整数类型的值上调用int(),Python将抛出一个ValueError异常。如:int('foo')。在这个例子中,如果我们遇到ValueError异常,我们将转为抛出django.http.Http404异常——正如你想象的那样:最终显示404页面(提示信息:页面不存在)。
|
|
15325@qq.com
|
2.0/chapter03/#448 |
2009-10-23 16:46:41
|
(从技术上来说,捕获值总是Unicode objects,而不是简单的Python字节串,但目前不需要担心这些差别。)
|
|
15325@qq.com
|
2.0/chapter03/#446 |
2009-10-23 16:43:51
|
例如:如果请求URL是/time/plus/3/,那么offset将会是3;如果请求URL是/time/plus/21/,那么offset将会是21。请注意:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。
|
|
15325@qq.com
|
2.0/chapter03/#446 |
2009-10-23 16:43:06
|
例如:如果请求URL是/time/plus/3/,那么offset将会是3;如果请求URL是/time/plus/21/,那么offset将会是21。请注意:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成。
|
|
15325@qq.com
|
2.0/chapter03/#437 |
2009-10-23 16:37:00
|
让我们逐行分析一下代码:
|
|
15325@qq.com
|
2.0/chapter03/#434 |
2009-10-23 16:36:20
|
以下是view代码:
|
|
15325@qq.com
|
2.0/chapter03/#421 |
2009-10-23 16:35:21
|
嗯,怎么说呢,每个开发者是不一样的。
|
|
15325@qq.com
|
2.0/chapter03/#421 |
2009-10-23 16:33:32
|
嗯,每个开发者都是不同的。
|
|
15325@qq.com
|
2.0/chapter03/#418 |
2009-10-23 16:32:49
|
这个例子中,我们先写了URLpattern ,然后是视图,但是在前面的例子中, 我们先写了视图,然后是URLpattern 。
|
|
15325@qq.com
|
2.0/chapter03/#419 |
2009-10-23 16:32:19
|
哪一种方式比较好?
|
|
15325@qq.com
|
2.0/chapter03/#411 |
2009-10-23 16:31:33
|
最终的URLconf包含上面两个视图,如:
|
|
15325@qq.com
|
2.0/chapter03/#402 |
2009-10-23 16:29:30
|
从现在开始,本文所有URL模式都用原始字符串。
|
|
15325@qq.com
|
2.0/chapter03/#401 |
2009-10-23 16:27:14
|
当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“\n”是两个字符串:“\”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。
|
|
15325@qq.com
|
2.0/chapter03/#400 |
2009-10-23 16:17:18
|
在普通Python字符串中,反斜杠用于特殊字符的转义。比如\n转义成一个换行符。
|
|
15325@qq.com
|
2.0/chapter03/#399 |
2009-10-23 16:14:45
|
它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。
|
|
15325@qq.com
|
2.0/chapter03/#398 |
2009-10-23 16:11:30
|
另外一个重点,正则表达式字符串的开头字母“r”。
|
|
15325@qq.com
|
2.0/chapter03/#387 |
2009-10-23 16:06:55
|
(见上)
|
|
15325@qq.com
|
2.0/chapter03/#386 |
2009-10-23 16:06:41
|
这里使用# ...来表示省略了其它可能存在的URL模式定义。
|
|
15325@qq.com
|
2.0/chapter03/#383 |
2009-10-23 16:03:15
|
答案是:使用通配符(wildcard URLpatterns)。正如我们之前提到过,一个URL模式就是一个正则表达式。因此,这里可以使用\d+来匹配1个以上的数字。
|
|
15325@qq.com
|
2.0/chapter03/#383 |
2009-10-23 16:02:57
|
答案是:使用通配符(wildcard URLpatterns)。正如我们之前提到的那样,一个URL模式就是一个正则表达式。因此,这里可以使用\d+来匹配1个以上的数字。
|
|
15325@qq.com
|
2.0/chapter03/#382 |
2009-10-23 16:00:18
|
那么,我们如何设计程序来处理任意数量的时差?
|
|
15325@qq.com
|
2.0/chapter03/#374 |
2009-10-23 15:56:30
|
就像/time/plus?hours=3里面的小时应该在查询字符串中被参数hours指定(问号后面的是参数)。
|
|
15325@qq.com
|
2.0/chapter03/#373 |
2009-10-23 15:48:05
|
如果你有其它web平台的开发经验(如PHP或Java),你可能会想:嘿!让我们用查询字符串参数吧!
|
|
15325@qq.com
|
2.0/chapter03/#358 |
2009-10-23 15:44:45
|
举个例子,一家在线书店会为每一本书提供一个URL,如:/books/243/、/books/81196/。
|
|
15325@qq.com
|
2.0/chapter03/#353 |
2009-10-23 15:30:54
|
第三个视图
|
|
15325@qq.com
|
2.0/chapter03/#350 |
2009-10-23 15:29:37
|
URLconf和视图是松耦合的。
|
|
15325@qq.com
|
2.0/chapter03/#347 |
2009-10-23 15:27:53
|
这是一个故弄玄虚的例子,但这个方法迟早会用得上。
|
|
15325@qq.com
|
2.0/chapter03/#346 |
2009-10-23 15:26:01
|
在这个例子里,current_datetime被两个URL使用。
|
|
15325@qq.com
|
2.0/chapter03/#341 |
2009-10-23 15:25:12
|
例如,考虑一下current_datetime视图。
|
|
15325@qq.com
|
2.0/chapter03/#329 |
2009-10-23 15:24:12
|
(它必须有个值,它的默认值是Django的诞生地:美国/芝加哥)如果你处在别的时区,你需要在settings.py文件中更改这个值。请参见它里面的注释,以获得最新世界时区列表。
|
|
15325@qq.com
|
2.0/chapter03/#325 |
2009-10-23 15:18:17
|
Django时区
|
|
15325@qq.com
|
2.0/chapter03/#328 |
2009-10-23 15:18:05
|
这是因为Django是有时区意识的,并且默认时区为America/Chicago。
|
|
15325@qq.com
|
2.0/chapter03/#328 |
2009-10-23 15:17:50
|
这是因为Django是有时区意识的,并且默认为America/Chicago。
|
|
15325@qq.com
|
2.0/chapter03/#327 |
2009-10-23 15:16:02
|
视乎你的机器,显示的日期与时间可能和实际的相差几个小时。
|
|
15325@qq.com
|
2.0/chapter03/#323 |
2009-10-23 15:12:48
|
你将看到当前的日期和时间。
|
|
15325@qq.com
|
2.0/chapter03/#322 |
2009-10-23 15:12:22
|
写好视图并且更新URLconf之后,运行命令python manage.py runserver以启动服务,在浏览器中输入http://127.0.0.1:8000/time/。
|
|
15325@qq.com
|
2.0/chapter03/#325 |
2009-10-23 15:08:59
|
Django时区代码
|
|
15325@qq.com
|
2.0/chapter03/#320 |
2009-10-23 15:08:01
|
理解了么?
|
|
15325@qq.com
|
2.0/chapter03/#319 |
2009-10-23 15:07:06
|
其次,也是比较重要的:添加URL模式来映射URL中的/time/和新视图。
|
|
15325@qq.com
|
2.0/chapter03/#318 |
2009-10-23 15:04:36
|
首先,在顶部导入current_datetime函数;
|
|
15325@qq.com
|
2.0/chapter03/#318 |
2009-10-23 15:01:33
|
第一,在顶部导入current_datetime函数;
|
|
15325@qq.com
|
2.0/chapter03/#317 |
2009-10-23 15:00:12
|
这里,我们修改了两个地方。
|
|
15325@qq.com
|
2.0/chapter03/#314 |
2009-10-23 14:59:44
|
用/time/之类的字眼易于理解:
|
|
15325@qq.com
|
2.0/chapter03/#313 |
2009-10-23 14:57:24
|
添加上述代码之后,还要在urls.py中添加URL模式,以告诉Django由哪一个URL来处理这个视图。
|
|
15325@qq.com
|
2.0/chapter03/#311 |
2009-10-23 14:54:55
|
最后,正如我们刚才写的hello函数一样,视图返回一个HttpResponse对象,它包含生成的响应。
|
|
15325@qq.com
|
2.0/chapter03/#307 |
2009-10-23 14:50:18
|
字符串中的%s是占位符,字符串后面的百分号表示用它后面的变量now的值来代替%s。变量%s是一个datetime.datetime对象。它虽然不是一个字符串,但是%s(格式化字符串)会把它转换成字符串,如:2008-12-13
14:09:39.002731。这将导致HTML的输出字符串为:It is now 2008-12-13
14:09:39.002731。
|
|
15325@qq.com
|
2.0/chapter03/#309 |
2009-10-23 12:32:28
|
(目前HTML是有错误的,但我们这样做是为了保持例子的简短。)
|
|
15325@qq.com
|
2.0/chapter03/#302 |
2009-10-23 12:30:55
|
在文件顶端,我们添加了一条语句:import datetime。这样就可以计算日期了。
|
|
15325@qq.com
|
2.0/chapter03/#300 |
2009-10-23 12:29:13
|
让我们分析一下改动后的views.py:
|
|
15325@qq.com
|
2.0/chapter03/#298 |
2009-10-23 12:27:41
|
(见上)
|
|