Django路由介绍
一,路由的作用
URL配置就是Django支持的网址的目录,它的本质是URL与调用的视图函数之间的映射表,用URL告诉Django该执行哪个函数。
二,路由的配置
from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ]
ps:第一个参数是正则表达式,匹配规则按照从上往下依次匹配,匹配到一个之后会立即匹配,直接执行其对应的视图函数
网站首页路由:
url(r'^$',views.home)
网址不存在路由:
url(r'',views.error)
三,无名分组
本质:将加括号的正则表达式匹配到内容当做位置参数自动传递给对应的视图函数。
urls.py
url(r'^test/(\d+)/',views.test), # 匹配一个或多个数字
views,py
def test(request,xxx): # 括号中内容传给了XXX print(xxx) return HttpResponse('test')
四,有名分组
本质:将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数。
urls.py
url(r'^test/(?P<year>\d+)/',views.test), # 匹配一个或多个数字(?<year>:给参数取名叫year)
views.py
def test(request,year): # 括号中的参数部分传给了year print(year) return HttpResponse('test')
ps:1,无名分组和有名分组不能混着用。2,可以支持用类型多个形式匹配
url(r'^test/(\d+)/(\d+)/',views.test), # 无名分组多个 url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test), # 有名分组多个
五,反向解析:
本质:就是获取到一个能够访问名字所对应的视图函数(根据名字动态获取对应的路径)
方式:
在前端中:
{# 在前端页面中,跳转到test函数,并且携带两个参数10,23#} <a href="{% url 'test' 10 23 %}">哈哈</a>
在urls.py中:
from django.conf.urls import url from app01 import views urlpatterns = [ # 两个参数一个year被,一个month # 与视图函数的对应关系命名为test url(r'^test/(?P<year>[0-9]{2})/(?P<month>[0-9]{2})/$',views.url_test,name='test'), ]
在视图函数中:
from django.shortcuts import render, HttpResponse,redirect,reverse def url_test(request,year,month): print(year) print(month) url=reverse('test',args=(10,20)) print(url) return HttpResponse('ok')
总结:
1:在html中:{% url "别名" 参数 参数%}
2:url=reverse('test',args=(10,20))
ps:
1:可以给每一个路由与视图函数对应关系起一个名字
2:这个名字能够唯一标识出对应的路径
3:注意这个名字不能重复是唯一的
六:路由分发:
项目名下的urls,py(总路由)不再做路由与视图函数的匹配关系而是做路由分发。
总路由:
from django.conf.urls import include urlpatterns = [ # 路由分发 注意路由分发总路由千万不要$结尾 url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls)) ]
在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可。
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
七,名称空间:
原因:由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
在路由分发的时候处理名称空间:
url(r'app01/',include('app01.urls',namespace='app01')), url(r'app02/',include('app02.urls',namespace='app02'))
ps:用处很少,因为我们命名的时候都会用不同的名字,(前缀用项目名标识)
八,伪静态:
后缀为.html结尾会被认为是静态网页(数据不变),在url后面加上.html增加被收录的概率。
url(r'^index.html',views.index) url(r'^test/(\d+.html)',views.index) url(r'^demo/(?P<year>\d+.html)')
九,虚拟环境:
虚拟环境创建(先创建一个python项目,选择虚拟项目记得勾选能够被应用于其他项目,下次创建项目时即可选择改虚拟环境作为开发环境)
Django2.0版本与1.0区别
一:1.0版本的url和2.0版本的re_path分组出来的数据都是字符串类型
二:默认有五个转换器,感兴趣的自己可以课下去试一下
三:str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
四:int,匹配正整数,包含0。
五:slug,匹配字母、数字以及横杠、下划线组成的字符串。
六:uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
七:path,匹配任何非空字符串,包含了路径分隔符(/)
十,自定义转换器:
三部分:1:正则表达式 2:to_python 3:to_url
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value 占四位,不够用0填满,超了则就按超了的位数来! register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive) ]