1、什么是urls?
就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。
2、简单的路由配置
from django.conf.urls import url,include from app01 import views urlpatterns = [ url(r'datatimes/(\d{4})/(\d{2})$', views.year_pipei), ]
- 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是
^articles
而不是^/articles
。 - 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
3、有名分组
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,其中name
是组的名称,pattern
是要匹配的模式。
下面是以上URLconf 使用命名组的重写:
from django.conf.urls import url,include from app01 import views urlpatterns = [ url(r'datatimes/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_pipei) ]
这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:
/articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。
4、分发
如果一个项目中有多个app,我们如何判断一个路由是执行哪个app?这样我们就用到了路由的分发,首先我们要在每个app中创建一个urls.py文件,然后在全局的urls.py中编写:
from django.conf.urls import url, include from django.contrib import admin from app02 import views #如果两个app中的都有导入的views下面的会覆盖上面的 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/', include('app01.urls')), #指以app01开头的路由,会分发到app01的views.py中 url(r'^app02/', include('app02.urls')), ]
这样我们就可以用app01开头的路由地址来执行app01中的urls.py,用app02开头的路由地址执行app02中的urls.py。
5、反向解析
在模版login.html中有如下代码:
<form action="/index/"method="post"> 用户名<input type="text" name="user"> 密码<input type="password" name="pwd"> <input type="submit">
就是触发事件后,将跳转到路由为index的页面,但是如果路由index被修改后,这里就不能用了,得把这里的路由修改之后才能正常执行,很显然这样很麻烦,这时我们就需要反向解析了,
在urls.py中给路由加上name属性:
url(r'index', views.login, name='xxx')
再给模板中改为如下:
<form action="{% url 'xxx' %}"method="post"> 用户名<input type="text" name="user"> 密码<input type="password" name="pwd"> <input type="submit">
这样不管将来路由index改为任何形式,多会被name传给模板,这就是反向解析。