在 Django 框架中,urls.py 的设置很关键,它决定了所有页面的 URL 长什么样子。所以很有必要我们开一个专题来探讨它的使用。
我们先来粗略看看 urls.py 的样子,虽然前面也有介绍,我们这里算是复习一下吧:
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'nowamagic.views.home', name='home'), # url(r'^nowamagic/', include('nowamagic.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), )
前面也谈过,只要配置这么一条规则:
(r'^hello/$'
,hello),
就可以定义 http://127.0.0.1:8000/hello/ 路径显示 views.py 中的 hello 函数。
-
模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义:上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。^hello/$匹配hello/字符串,即在网址http://127.0.0.1:8000/hello/找到hello/后,使用hello()函数显示出来,如果没有'$'结尾,则网址中输入hello1/;hello2/都会对应以hello()函数显示出来。
hello 函数我们随便写写:
from django.http import HttpResponse,Http404 def hello(request): #每个视图函数至少要有一个参数,通常被叫作request。 return HttpResponse("Hello NowaMagic!") #一个视图功能必须返回一个HttpResponse
(r index 函数就是生成首页的 view 函数。 顺便说下,在 view 函数里,return HttpResponseRedirect('../'):返回主页,即127.0.0.1。
*************************************************************************************************** urls.py 的规则URL配置(URLconf)就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。
例如:我的 Django 项目的根目录名为“pearl”,ROOT_URLCONF的默认值为“pearl.urls”。我们知道,urls.py 是用来配置 URL 的,那么它是如何工作的呢? 我们先来看看这个规则的原型: from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^login/$', openid_login, {}, 'openid-login'), ) 即: from django.conf.urls.defaults import * urlpatterns = patterns(前缀, (表达式, 视图函数, 视图函数, 名称), ) “前缀”会在视图函数里面会自动加上指引。view = prefix + '.' + view,最后调用RegexURLPattern(regex, view, kwargs, name)。 那么 RegexURLPattern() 又是长什么样子呢?先看看,暂不作深入讨论。 class RegexURLPattern(object): def __init__(self, regex, callback, default_args=None, name=None): self.regex = re.compile(regex, re.UNICODE) if callable(callback): self._callback = callback URL的规则,Django会如何处理?要弄清Django如何处理URL配置规则,先要了解几个概念。
由于每个处理方式都需要一定篇幅介绍,故这里只作概念介绍,具体的介绍放在后面的小节里。
|