首页 > 代码库 > Django学习之URLconf

Django学习之URLconf

Django处理request的步骤:

1.确定根URLconf

2.载入urls.py,找到变量urlpatterns,urlpatterns是django.conf.urls.url()的实例对象(列表)

url(regex, view, kwargs=None, name=None)[source]
regex是一个字符串或者 ugettext_lazy(),字符串包含正则表达式,兼容re模块,字符串通常使用原始字符串语法(r“),以便它们可以包含像\ d这样的序列,而不需要使用另一个反斜杠来转义反斜杠。

view参数是一个视图函数,或者基于类的视图的as_view()的结果,亦或者是一个include()。

kwargs允许像视图函数或者方法传递额外的参数,参见 Passing extra options to view functions查看实例。

name参数的意义查看 Naming URL patterns 
Naming URL patterns
为了执行URL反转,您需要使用命名URL模式,如上例所示。 用于URL名称的字符串可以包含您喜欢的任何字符。 

当您命名URL模式时,请确保使用不太可能与任何其他应用程序选择的名称冲突的名称。 如果您调用了URL模式注释,而另一个应用程序也执行相同的操作,那么在使用此名称时,不能保证在您的模板中插入哪个URL。

在您的网址名称上放置一个前缀,也许是从应用程序名称派生出来的,可以减少碰撞的几率。 我们建议像myapp-comment而不是comment。
Passing extra options to view functions

URLconfs有一个钩子,可以让您传递额外的参数到您的视图函数,作为Python字典。

django.conf.urls.url()函数可以使用一个可选的第三个参数,它应该是一个额外的关键字参数的字典,以传递给view函数。

例如:
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r^blog/(?P<year>[0-9]{4})/$, views.year_archive, {foo: bar}),
]
在联合框架中使用此技术将元数据和选项传递给视图。

在这个例子中,对于/ blog / 2005 /的请求,Django将调用views.year archive(request,year =‘2005‘,foo =‘bar‘)。

处理冲突

可以使用一个URL模式来捕获命名关键字参数,并在其额外参数的字典中传递具有相同名称的参数。 当这种情况发生时,字典中的参数将被使用,而不是在URL中捕获的参数。

3.Django按顺序执行每一个URL模式,当第一个request的URL匹配即停止向下执行

4.一旦正则表达式匹配成功,Django导入并执行视图函数(或者基于类的视图函数),以下参数可传递到视图函数:

HttpRequest实例对象

如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。

关键字参数由正则表达式匹配的任何命名组组成,由在django.conf.urls.url()的可选kwargs参数中指定的任何参数覆盖。

5.如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。 参见下面的错误处理。

命名组

上述示例使用简单的,未命名的正则表达式组(通过括号)捕获URL的位,并将它们作为位置参数传递给视图。 在更高级的使用中,可以使用命名的正则表达式组来捕获URL位,并将它们作为关键字参数传递给视图。

在Python正则表达式中,命名的正则表达式组的语法是(?P <name> pattern),其中name是组的名称,而pattern是某些匹配的模式。

 

Django学习之URLconf