**
路由系统:
URL配置(URLconf)就像Django所支撑网站的目录. 本质是URL与该URL要调用的函数的映射表
基本格式 : from django.conf.urls import url urlpatterns = [ url(正则表达式,views视图,参数,别名) ] 参数 -- 传给函数视图的默认参数 (字典形式) 别名 -- 一个可选的name参数 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配) 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles 每个正则表达式前面的'r' 是可选的但是建议加上 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项 APPEND_SLASH=True (d+) 正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图 (?P < name > pattern),其中name是组的名称,pattern是要匹配的模式 可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图 在实际应用中,使用分组命名匹配的方式可以让你的URLconf 更加明晰且不容易产生参数顺序问题的错误,但是有些开发人员则认为分组命名组语法太丑陋、繁琐 URLconf 匹配的位置 *** 例如 http://www.example.com/myapp/ 请求中,URLconf 将查找 /myapp/ http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 /myapp/ URLconf 不检查请求的方式 换言之,所有的请求方法 -- 同一个URL的POST,GET,HEAD,等等,都将路由到相同的函数 捕获的参数永远都是字符串 *** re匹配 match // find all // search 每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式 url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive) 传递到视图函数views.year_archive() 中的year参数永远是一个字符串类型 视图函数指定默认值
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # views.py中,可以为num指定默认值 def page(request, num="1"): pass
上面例子上,两个url 模式指向相同的 函数,但是第一个模式并没有从url中捕获任何东西
如果第一个匹配上了,page()函数将使用其默认参数num='1',如果第二个匹配上了,page()
将使用正则表达式捕获到的num值
include 其他的URLconfs --从其他地方导入urls
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), # 可以包含其他的URLconfs文件 ]
传递额外的参数给视图函数
URLconfs 具有一个钩子,让你传递一个python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 可以接受一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数
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中捕获的参数
命名URL和URL反向解析
在使用Django 项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等). -- 反向解析 -- 反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查 在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查: 1 在模板中: 使用url模板标签 2 在python代码中:使用django.core.urlresolvers.reverse() 函数 3 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法
使用 -- 给我们的URL匹配规则起个名字,一个URL模式起一个名字,只需要通过名字调用当前的URL
下面举例:
url(r'^home', views.home, name='home'), # 给我的url匹配模式起名为 home url(r'^index/(d*)', views.index, name='index'), # 给我的url匹配模式起名为index 后面再模板中引用: --HTML-- {% url 'home' %} 在views函数中可以这样引用 --py-- from django.urls import reverse reverse("index", args=("2018", ))
命名 空间模式
即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL
举例 project中的urls.py from django.conf.urls import url, include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ] app01中的urls.py from django.conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r'^(?P<pk>d+)/$', views.detail, name='detail') ] app02中的urls.py from django.conf.urls import url from app02 import views app_name = 'app02' urlpatterns = [ url(r'^(?P<pk>d+)/$', views.detail, name='detail') ] 现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL 下面是语法: '命名空间名称:URL名称' 模板中使用: -html- {%url 'app01:detail' pk=12 pp=99 %} views 中函数使用 -py- v = reverse('app01:detail',kwargs={'pk':11})
https://www.cnblogs.com/maple-shaw/articles/9282718.html -- 路由--