目录
2、模板层内的反向解析:{% url "别名" 参数 参数%}
2-1 转换器:将url传入的参数进行对应匹配,将符合匹配的接在url路径后
一、简单路由实现(1.x)
from django.conf.urls import url from app01 import views ''' urlpatterns = [ url(正则表达式, views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]), ] ''' urlpatterns = [ url(r'^blog/$', views.blog), ]
二、无名分组
总结:
- 按位置传参
- url分组,以‘/’进行分组,
- def publish(request,*args): 视图函数可以这样接收
- 不可与有名分组混用
from django.conf.urls import url from app01 import views ''' urlpatterns = [ url(正则表达式(传入参数), views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]), ] ''' urlpatterns = [ # 路由后跟四个0-9的数字当做参数传给视图函数 url(r'^blog/([0-9]{4})', views.blog), url(r'^publish/([0-9]{4})/([0-9]{2})$', views.publish) ]
# 视图函数接受参数 def blog(request,year): print(year) return HttpResponse('ok') # 按位置接受传参 def blog(request,*args): return HttpResponse('ok')
三、有名分组
总结:
- 按关键字传参
- url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
--- 格式:(?P<name>pattern);
name:组的名称; pattern :匹配的模式- def publish(request, mounth,year): 视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关
- 不能和无名分组混用
from django.conf.urls import url from app01 import views ''' urlpatterns = [ url(正则表达式(传入参数), views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]), ] ''' urlpatterns = [ # 路由后跟四个0-9的数字取名为year当做参数传给视图函数 url(r'^blog/(?P<year>[0-9]{4})', views.blog), url(r'^publish/(?P<year>[0-9]{4})/(?P<day>[0-9]{2})$', views.publish) ]
# 视图函数接受参数 def blog(request,day,year): print(year) print(day) return HttpResponse('ok')
四、反向解析:动态更改所有路径
1、视图函数内的反向解析:reverser()
''' # urls.py文件内的路由配置 -1 无参数 url(r'^publishadd133/$', views.publishadd,name='ddd'), -2 无名分组 url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'), -3 有名分组 url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'), ''' from django.shortcuts import reverse # 无参数 url=reverse('ddd') # 无名分组 url=reverse('ddd',args=(2018,12,)) # 有名分组 url=reverse('ddd',args=(2018,12,)) url=reverse('ddd',kwargs={'year':2018,'mounth':12})
2、模板层内的反向解析:{% url "别名" 参数 参数%}
''' # urls.py文件内的路由配置 -1 无参数 url(r'^publishadd133/$', views.publishadd,name='ddd'), -2 无名分组 url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'), -3 有名分组 url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'), ''' # 无参数 {% url 'ddd' %} # 无名分组 {% url 'ddd' 2018 12 %} # 有名分组 {% url 'ddd' 2018 12 %} {% url 'ddd' year=2018 mounth=12 %}
五、路由分发(1.x):防止一个路由文件的庞大导致可读性差
# 总路由文件 from django.conf.urls import url,include urlpatterns = [ url(r'^app01/',include('app01.urls')) url(r'^app02/',include('app02.urls')) ] ''' 注意: 总路由文件内,不能在正则匹配内添加$结束符 '''
# app文件夹内路由文件 from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^user/$',view.user) url(r'^user_list/$',view.user_list) ] ''' 浏览器查看指定路由:128.0.0.1:8000/app02/user '''
六、名称空间(namespace):防止重名路由冲突
命名空间(英语:Namespace)是表示标识符的可见范围。
一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
# 导入include 并且在路由分发的时候设置 namespace from django.conf.urls import url,include urlpatterns = [ url(r'^app00/',include('app00.urls',namespace='app00')), url(r'^app01/',include('app01.urls',namespace='app01')), ]
# 视图函数诶的反向解析 url=reverse('app00:index') print(url) url2=reverse('app01:index') print(url2) # 模板层内的反向解析 {% url 'app01:test'%} # <a href="{% url 'app00:index'%}">哈哈</a>
七、伪静态:伪装成静态网页,有利于搜索导航的优先匹配
# 路由的书写 # 有名分组 id匹配一个数字 字符串连接.html url(r'^book/(?P<id>\d+.html)',views.book), # 路由器的访问 :http://127.0.0.1:8000/book/4.html
八、Django - 2.X 和1.X的区别
1、2.0的re_path 用法等同于 1.0的url
from django.contrib import admin from django.urls import path, re_path from app01 import views urlpatterns = [ # re_path---->原来的url # re_path('正则',视图函数) re_path('^test/(?P<year>\d+)',views.re_test), ]
2、path :使用精确路径代替正则匹配
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ # path传的第一个参数,不是正则,准确的路径,不支持正则 # path('精确路径/<转换器:匹配路径参数>',视图函数(不支持传参操作),别名) # path('test/<path:year>', views.re_test), # path('test/<yyy:year>', views.re_test,name='test'), path('test/', views.re_test,), ]
2-1 转换器:将url传入的参数进行对应匹配,将符合匹配的接在url路径后
- str,匹配除了路径分隔符(
/
)之外的非空字符串,这是默认的形式- int,匹配正整数,包含0。
- slug,匹配字母、数字以及横杠、下划线组成的字符串。
- uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path,匹配任何非空字符串,包含了路径分隔符(/)
2-2 自定义转换器
from django.contrib import admin #导入自定义转换器所需的 register_converter from django.urls import path,register_converter from app01 import views # 自定义转换器 # 1 定义一个类 class MyCon: # 写一个正则表达式 regex = '[0-9]{4}' # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收 def to_python(self, value): return value # 反向解析用的 def to_url(self, value): return '%04d' % value #注册转换器名: register_converter(自定义类名,'自定义转换器名') register_converter(MyCon,'yyy') urlpatterns = [ path('test/<yyy:year>', views.re_test,name='test'), ]
九、项目路由配置小技巧
- 根路径配置,即首页默认指定视图函数 url(r'^$',views.book)
- 配置错误路径,即从上至下无匹配路径之后响应默认视图函数 url(r'',views.errors)