django动态url
来源:互联网 发布:linux 下编程工具 编辑:程序博客网 时间:2024/06/05 13:52
程序实现
我们创建第三个视图来显示当前时间和加上时间偏差量的时间,设计是这样的: /time/plus/1/ 显示当前时间+1个小时的页面 /time/plus/2/ 显示当前时间+2个小时的页面 /time/plus/3/ 显示当前时间+3个小时的页面,以此类推。
1. urls.py
1
from
django.conf.urls.defaults
import
*
2
from
PythonProject.views
import
hello, current_datetime, hours_ahead
3
4
urlpatterns
=
patterns('',
5
(
'^hello/$'
, hello),
6
(
'^time/$'
, current_datetime),
7
(r
'^time/plus/(\d{1,2})/$'
, hours_ahead),
8
)
2. views.py
01
from
django.http
import
Http404, HttpResponse
02
import
datetime
03
04
def
hello(request):
05
return
HttpResponse(
"Hello NowaMagic"
)
06
07
def
current_datetime(request):
08
now
=
datetime.datetime.now()
09
html
=
"<html><body>It is now %s.</body></html>"
%
now
10
return
HttpResponse(html)
11
12
def
hours_ahead(request, offset):
13
offset
=
int
(offset)
14
dt
=
datetime.datetime.now()
+
datetime.timedelta(hours
=
offset)
15
html
=
"<html><body>In %s hour(s), it will be %s.</body></html>"
%
(offset, dt)
16
return
HttpResponse(html)
现在访问 http://127.0.0.1:8000/time/plus/3/,比实际时间多了 3 小时。OK,程序通过。
程序解释
新手可能会考虑写不同的视图函数来处理每个时间偏差量,URL配置看起来就象这样:
1
urlpatterns
=
patterns('',
2
(
'^time/$'
, current_datetime),
3
(
'^time/plus/1/$'
, one_hour_ahead),
4
(
'^time/plus/2/$'
, two_hours_ahead),
5
(
'^time/plus/3/$'
, three_hours_ahead),
6
(
'^time/plus/4/$'
, four_hours_ahead),
7
)
很明显,这样处理是不太妥当的。 不但有很多冗余的视图函数,而且整个应用也被限制了只支持 预先定义好的时间段,2小时,3小时,或者4小时。如果哪天我们要实现 5 小时,我们就 不得不再单独创建新的视图函数和配置URL,既重复又混乱。 我们需要在这里做一点抽象,提取一些共同的东西出来。
那么,我们如何设计程序来处理任意数量的时差? 答案是:使用通配符(wildcard URLpatterns)。正如我们之前提到过,一个URL模式就是一个正则表达式。因此,这里可以使用d+来匹配1个以上的数字。
1
urlpatterns
=
patterns('',
2
# ...
3
(r
'^time/plus/(\d+)/$'
, hours_ahead),
4
# ...
5
)
这个URL模式将匹配类似 /time/plus/2/ , /time/plus/25/ ,甚至 /time/plus/100000000000/ 的任何URL。 更进一步,让我们把它限制在最大允许99个小时,这样我们就只允许一个或两个数字,正则表达式的语法就是 \d{1,2} :
1
(r
'^time/plus/(\d{1,2})/$'
, hours_ahead),
另外一个重点,正则表达式字符串的开头字母“r”。 它告诉python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。 从现在开始,本文所有URL模式都用原始字符串。
现在我们已经设计了一个带通配符的URL,我们需要一个方法把它传递到视图函数里去,这样 我们只用一个视图函数就可以处理所有的时间段了。 我们使用圆括号把参数在URL模式里标识 出来。 在这个例子中,我们想要把这些数字作为参数,用圆括号把 \d{1,2} 包围起来:
1
(r
'^time/plus/(\d{1,2})/$'
, hours_ahead),
如果你熟悉正则表达式,那么你应该已经了解,正则表达式也是用圆括号来从文本里 提取 数据的。
让我们逐行分析一下 views.py 的代码:
视图函数, hours_ahead , 有 两个 参数: request 和 offset .
request 是一个 HttpRequest 对象, 就像在 current_datetime 中一样. 再说一次好了: 每一个视图 总是 以一个 HttpRequest 对象作为 它的第一个参数。
offset 是从匹配的URL里提取出来的。 例如:如果请求URL是/time/plus/3/,那么offset将会是3;如果请求URL是/time/plus/21/,那么offset将会是21。请注意:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。
在这里我们命名变量为 offset ,你也可以任意命名它,只要符合Python 的语法。 变量名是无关紧要的,重要的是它的位置,它是这个函数的第二个 参数 (在 request 的后面)。 你还可以使用关键字来定义它,而不是用 位置。
我们在这个函数中要做的第一件事情就是在 offset 上调用 int() . 这会把这个字符串值转换为整数。
请留意:如果你在一个不能转换成整数类型的值上调用int(),Python将抛出一个ValueError异常。如:int(‘foo’)。在这个例子中,如果我们遇到ValueError异常,我们将转为抛出django.http.Http404异常——正如你想象的那样:最终显示404页面(提示信息:页面不存在)。
机灵的读者可能会问: 我们在URL模式中用正则表达式(d{1,2})约束它,仅接受数字怎么样?这样无论如何,offset都是由数字构成的。 答案是:我们不会这么做,因为URLpattern提供的是“适度但有用”级别的输入校验。万一这个视图函数被其它方式调用,我们仍需自行检查ValueError。 实践证明,在实现视图函数时,不臆测参数值的做法是比较好的。 松散耦合,还记得么?
下一行,计算当前日期/时间,然后加上适当的小时数。 在current_datetime视图中,我们已经见过datetime.datetime.now()。这里新的概念是执行日期/时间的算术操作。我们需要创建一个datetime.timedelta对象和增加一个datetime.datetime对象。 结果保存在变量dt中。
这一行还说明了,我们为什么在offset上调用int()——datetime.timedelta函数要求hours参数必须为整数类型。
这行和前面的那行的的一个微小差别就是,它使用带有两个值的Python的格式化字符串功能, 而不仅仅是一个值。 因此,在字符串中有两个 %s 符号和一个以进行插入的值的元组: (offset, dt) 。
最终,返回一个HTML的HttpResponse。
OK,程序解释完毕。用 Django 实现动态 URL 大概就这样。
五、Q&A
*先写URLpattern还是先写视图?
根据个人喜好,一般设定主框架时,可以先写出URLpattern,在开发具体的视图;细节处,可以先写好视图函数,然后在挂到
URLpattern上。
*正则表达式
. (dot) 任意单一字符
\d 任意一位数字
[A-Z] A 到 Z中任意一个字符(大写)
[a-z] a 到 z中任意一个字符(小写)
[A-Za-z] a 到 z中任意一个字符(不区分大小写)
+ 匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+ 一个或多个不为‘/’的字符
? 零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
* 匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3} 介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)
- django动态url
- 用Django实现动态URL
- Django学习笔记(第三节) 动态URL
- [Django入门知识浅介]用Django实现动态URL
- Django URL
- Django url
- Django---URL
- django 中文 url 问题
- DJANGO获取当前URL
- django中url配置
- Django的url解析
- Django URL 解析
- django URL映射过程
- Django的url用法
- django--URL配置
- django url正则
- django过滤器-----url
- django url调度
- 两个栈实现一个队列,两个队列实现一个栈-JAVA
- poj 4124:海贼王之伟大航路
- ACM-8月31号周四周中训练心得
- JZ2440学习笔记,第三部分,移植uboot2015支持JZ2440的nand flash
- 如何获取sql数据中时间的月份、年份(类型date)
- django动态url
- 【教程】NFS挂载那些事
- p2p项目总结
- 比较ip是否在两个ip范围之间
- 深入Kotlin
- 游戏项目1-1
- YP.1.3 Two Recurring Themes(双语)
- MAP(Mean Average Precision)
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)