Django Book 2
Posted in Python on 十二月 14th, 2007 by admin – Be the first to comment你的第一个 URL 配置
所以,总的来说,这个视图函数返回了一个包含当前日期和时间的 HTML 页面。但是这些代码该放在哪里?我们又如何告诉 Django 来使用这些代码呢?
第一个问题的答案是:这些代码可以放在任何地方,只要在你 Python 路径中都可以。此外别无要求。为了说明这一点,我们来创建个文件 views.py,将上述代码拷贝进来,然后将它存储到我们先前创建的 mysite 目录中去。
Python 路径指的是当你使用 Python 的 import 语句时,Python 解释器将会搜寻的你系统上的一系列目录的列表。
例如,假设你的 Python 路径被设置为 [ '', '/usr/lib/python2.4/site-packages', '/home/mycode' ]。如果你执行 Python 代码 from foo import bar,Python 会首先检查当前目录是不是有个模块叫 foo.py(Python 路径的第一项,空字符串,意思是“当前路径”)。如果不存在这个文件,Python 会查找是否有文件 /usr/lib/python2.4/site-packages/foo.py。如果这个文件还是不存在,它会查找 /home/mycode/foo.py。最后,如果仍旧不存在,它会引发一个 ImportError 异常。
你如果有兴趣查看一下你自己的 Python 路径,可以开启 Python 解释器,然后键入 import sys,接着键入 print sys.path 就会看到结果。
通常你不必担心你的 Python 路径。Python 和 Django 会自动帮你设置好。(如果你好奇,设置 Python 路径是 manage.py 文件的功能之一。)
我们该如何告诉 Django 来使用这些视图代码呢?这正是 URL 配置所要做的事。
URL 配置就象你基于 Django 创建的 Web 站点的目录。基本上,它是 URL 模式与 URL 模式需要调用的视图函数之间的映射。正是使用它,你才可以告诉 Django,“对于这个 URL, 调用这些代码;对于那些 URL,调用那些代码。”
你先前的章节执行 django-admin.py startproject 的时候,脚本已经为你创建了 URL 配置文件:urls.py。我们来编辑这个文件。默认情况下,它看起来象这样:
1 2 3 4 5 6 7 8 9 | from django.conf.urls.defaults import * urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.apps.foo.urls.foo')), # Uncomment this for admin: # (r'^admin/', include('django.contrib.admin.urls')), ) |
我们来逐行看一下:
- 第一行从 django.conf.urls.defaults 模块中导入所有,包括一个名为 patterns 的函数。
- 第二行调用函数 patterns(),并且将结果存储进变量 urlpatterns。patterns() 函数只被传入了一个空字符串参数。其它行都被注释掉了。
这里最应该留心的就是变量 urlpatterns。正是它定义了 URL 与处理这些 URL 的代码之间的映射。
默认情况下,这份 URL 配置文件中的所有东西都被注释掉了,你的 Django 应用程序象个空白的毛坯石板。(注:Django 也会因此显示给你“It worked!”页。如果你的 URL 配置为空,Django 会假设你刚创建了一个新工程,因此,显示这个页面。)
我们来编辑这个文件以便让 current_datetime 视图可以被访问:
1 2 3 4 5 6 | from django.conf.urls.defaults import * from mysite.views import current_datetime urlpatterns = patterns('', (r'^now/$', current_datetime), ) |
我们改动了两个地方。首先,我们从 current_datetime 视图所在的模块(mysite/views.py,按照 Python 的导入语法它应该被转换为 mysite.views)导入它。然后,我们添加了一行( r’^now/$’, current_datetime )。这一行被称为 URL 模式,它实际上是一个 Python 元组,其中的第一个元素是一个简单的正则表达式,第二个元素是这种 URL 模式将要使用的视图函数。
总的来说,我们是要告诉 Django,所有针对 /now/ 这样的 URL 请求,应当由 current_datetime 视图函数来处理。
有几点需要指出:
- 请注意,在这个例子中,我们把 current_datetime 视图函数作为对象来传递,而不是直接调用这个函数。这是 Python 的一个关键特性(其它动态语言也是这样):函数是第一类对象,这也意味着你可以象传递变量一样来传递它。很酷的特性,是不是?
- 匹配 /now/ 没必要在 ‘^now/$’ 前面加反斜杠。Django 会自动在所有表达式前加上一个反斜杠。
- 字符“^”和“$”非常重要。“^”表示“匹配开始”,而美元符号意思是“匹配结束”。
这个概念最好用例子来解释。如果我们将上述模式换为 ‘^now/’ (后面没有美元符号),那么任何以 now/ 开始的 URL 都会被匹配,象 /now/foo 以及 /now/bar,而不仅仅是 /now/。与此相似,假设我们去掉上三角字符(’now/$’),则 Django 会匹配所有以 now/ 结尾的 URL,诸如 /foo/bar/now/ 等等。所以,我们同时使用这两个字符来确保只有 /now/ 这个 URL 会被匹配。
要测试这个 URL 配置,可以通过运行命令 python manage.py runserver 来启动开发服务器,象我们第一章所述那样。(如果它此前一直已经在运行着,也没关系。开发服务器会自动检测你的代码改动并且在需要的时候自动重新加载它们,所以你每次改动后不必重启服务器。)服务器运行在 http://127.0.0.1:8000,所以打开浏览器,输入 http://127.0.0.1:8000/now/,你应该就可以看到你的 Django 视图的输出结果了。
万岁!你的第一个 Django 网页已经完成了。
Powered by ScribeFire.