Django学习笔记之——Urls


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一致。

你可能感兴趣的:(Web,django,python)