UrlConf模块感觉就像是“路由”,它分析请求的路径,并请求派送给匹配的view去处理
打开mysite.urls.py文件,如下:
_____________________________________________________
from django.conf.urls import patterns, include, url
from views import home
import blog.urls
urlpatterns = patterns('',
url(r'^$', home),
url(r'^blog/', include(blog.urls))
)
-----------------------------------------------------
这里url()函数中的第一个参数则是路径的匹配正则式,第二个参数是对应的view。
注意:home与blog.urls必须是提前import了的。不然解析器不知道home与blog.urls
是什么,就会报错。
由于Python没有强制类型,而且在运行时可以识别变量的类型,所以url()与include()
设计得很灵活。它们还可以支持名称:
_____________________________________________________
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'mysite.views.home'),
url(r'^blog/', include('mysite.blog.urls'))
)
-----------------------------------------------------
这里用的是'mysite.views.home',注意是加了引号的,是字符串。
它的实现原理就是暂时记录名称,等manage.py运行起来之后再根据名称去动态import
对应的对象。
注意:名称必须是相对于manage.py的。'views.home', 'home'都是不正确的。
匹配参数
~~~~~~~~
在url()中还可以从路径上捕获组,并以参数的形式传给view函数。
urls.py :
___________________________________________________________________
urlpatterns = patterns('',
url(r'^date/(\d{4})-(\d{1,2})-(\d{1,2})', 'mysite.views.date'),
)
-------------------------------------------------------------------
用正则式的组捕获功能,将年月日分别捕获出来。
views.py :
___________________________
def date(request, *args):
print(args)
return HttpResponse()
---------------------------
让view函数date接受一个可变参数args,然后将其打印出来。
请求127.0.0.1:8000/date/2015-12-24
运行时打印的结果:
(u'2014', u'12', u'24')
为了可读性更好,我们可以将正则式这样写:
_______________________________________________________________________
url(r'^date/(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})',
'mysite.views.date'),
-----------------------------------------------------------------------
为每个组用(?P<name>xxxx)的方式命名。
而view这样改一下:
_____________________________________
def date(request, year, month, day):
print('year:' + year)
print('month:' + month)
print('day:' + day)
return HttpResponse()
-------------------------------------
添加yeas, month, day三个参数。而这三个参数与正则式的组名一一对应(在顺序上
无需对应)。
再次访问:127.0.0.1:8000/date/2015-12-24
输出结果:
year:2014
month:12
day:24
不仅如此,url()函数还有第三个参数,允许我们为view函数添加其它附加参数。
在urls.py添加url:
___________________________________________________________________________
urlpatterns = patterns('',
url(r'^extra$', 'mysite.views.extra_param', {'abc':120, 'xyz':'Hello'})
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
)
---------------------------------------------------------------------------
在views.py中添加extra_param函数:
_____________________________________
def extra_param(request, xyz, abc):
print(xyz)
print(abc)
return HttpResponse()
-------------------------------------
访问 http://127.0.0.1:8000/extra
服务控制端打印结果:
Hello
120
综上,我们可以非常灵活地使用url()进行访问地址匹配。
==========================================================================
关于urls.py中引用到的patterns(), url(), include()三个函数在:
django/conf/urls/__init__.py中定义。
include(arg, namespace=None, app_name=None)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include(arg)函数检查${arg}模块中是否包含urlpatterns属性。
并返回: (urlconf_module, app_name, namespace)
url(regex, view, kwargs=None, name=None, prefix='')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
返回一个RegexURLPattern对象。
patterns(prefix, *args)
~~~~~~~~~~~~~~~~~~~~~~~
返回一个RegexURLPattern对象列表,并使列表中的每个成员的prefix都与函数的
prefix一致。
打开mysite.urls.py文件,如下:
_____________________________________________________
from django.conf.urls import patterns, include, url
from views import home
import blog.urls
urlpatterns = patterns('',
url(r'^$', home),
url(r'^blog/', include(blog.urls))
)
-----------------------------------------------------
这里url()函数中的第一个参数则是路径的匹配正则式,第二个参数是对应的view。
注意:home与blog.urls必须是提前import了的。不然解析器不知道home与blog.urls
是什么,就会报错。
由于Python没有强制类型,而且在运行时可以识别变量的类型,所以url()与include()
设计得很灵活。它们还可以支持名称:
_____________________________________________________
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'mysite.views.home'),
url(r'^blog/', include('mysite.blog.urls'))
)
-----------------------------------------------------
这里用的是'mysite.views.home',注意是加了引号的,是字符串。
它的实现原理就是暂时记录名称,等manage.py运行起来之后再根据名称去动态import
对应的对象。
注意:名称必须是相对于manage.py的。'views.home', 'home'都是不正确的。
匹配参数
~~~~~~~~
在url()中还可以从路径上捕获组,并以参数的形式传给view函数。
urls.py :
___________________________________________________________________
urlpatterns = patterns('',
url(r'^date/(\d{4})-(\d{1,2})-(\d{1,2})', 'mysite.views.date'),
)
-------------------------------------------------------------------
用正则式的组捕获功能,将年月日分别捕获出来。
views.py :
___________________________
def date(request, *args):
print(args)
return HttpResponse()
---------------------------
让view函数date接受一个可变参数args,然后将其打印出来。
请求127.0.0.1:8000/date/2015-12-24
运行时打印的结果:
(u'2014', u'12', u'24')
为了可读性更好,我们可以将正则式这样写:
_______________________________________________________________________
url(r'^date/(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})',
'mysite.views.date'),
-----------------------------------------------------------------------
为每个组用(?P<name>xxxx)的方式命名。
而view这样改一下:
_____________________________________
def date(request, year, month, day):
print('year:' + year)
print('month:' + month)
print('day:' + day)
return HttpResponse()
-------------------------------------
添加yeas, month, day三个参数。而这三个参数与正则式的组名一一对应(在顺序上
无需对应)。
再次访问:127.0.0.1:8000/date/2015-12-24
输出结果:
year:2014
month:12
day:24
不仅如此,url()函数还有第三个参数,允许我们为view函数添加其它附加参数。
在urls.py添加url:
___________________________________________________________________________
urlpatterns = patterns('',
url(r'^extra$', 'mysite.views.extra_param', {'abc':120, 'xyz':'Hello'})
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
)
---------------------------------------------------------------------------
在views.py中添加extra_param函数:
_____________________________________
def extra_param(request, xyz, abc):
print(xyz)
print(abc)
return HttpResponse()
-------------------------------------
访问 http://127.0.0.1:8000/extra
服务控制端打印结果:
Hello
120
综上,我们可以非常灵活地使用url()进行访问地址匹配。
==========================================================================
关于urls.py中引用到的patterns(), url(), include()三个函数在:
django/conf/urls/__init__.py中定义。
include(arg, namespace=None, app_name=None)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include(arg)函数检查${arg}模块中是否包含urlpatterns属性。
并返回: (urlconf_module, app_name, namespace)
url(regex, view, kwargs=None, name=None, prefix='')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
返回一个RegexURLPattern对象。
patterns(prefix, *args)
~~~~~~~~~~~~~~~~~~~~~~~
返回一个RegexURLPattern对象列表,并使列表中的每个成员的prefix都与函数的
prefix一致。