路由控制
1. 简单的路由配置
- 作用:URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表
- 格式:
from django.conf.urls import url from django.contrib import admin from app名 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(正则表达式, views视图函数,参数,别名), ] (1)正则表达式:一个正则表达式字符串 (2)views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 (3)参数:可选的要传递给视图函数的默认参数(字典形式) 例: url(r'^register/$', views.register,{'name':'qqc','age':'11'}),视图函数中要有相对应的参数进行接收 (4)别名:一个可选的name参数
- 例子
注:Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
伪静态(以ntml结尾),方便搜索引擎收录.
2. 分组
2.1 无名分组
- 格式:
url(r'^admin/', admin.site.urls),
- 第一个参数,可以写一个正则表达式 从上往下匹配,一旦匹配成功,就不往下走了 如果分几个个组,相应的视图函数,就应该接收几个
2.2 有名分组
- 格式:
url('地址/(?P<name>pattern)', views.函数名)
注:name 是组的名称,pattern 是要匹配的模式
--------------------------------------
例子:
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
对应的函数:
def test(request,month,year): print(year) print(month) return HttpResponse('ok')
注:
(1)名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
(2)有名分组和无名分组不要混用
(3)有名分组可以用**kwargs接收,无名分组可以用*args接收
(4) 分组捕获的参数,都是str类型,捕获的值作为关键字参数而不是位置参数传递给视图函数
(5)视图函数可以设置默认参数
3. 路由分发
- 步骤
(1)在主urls文件导入from django.conf.urls import include (2)在主urls文件设置所要分发的app文件, 两种方式: url(r'^app01/', include('app01.urls')), url(r'^app01/', include(urls)) (3)urlpatterns 不能变名字,app文件中的url格式相同
例:
主urls:
from django.conf.urls import url,include from django.contrib import admin from app01 import views from app01 import urls urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/',include('app01.urls')), ] app文件中的urls: from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^func/(?P<year>[0-9]{2})/(?P<month>[0-9]{1})', views.func), ]
app 文件中的视图函数:
from django.shortcuts import render from django.shortcuts import render,HttpResponse,reverse def func(request,year,month): print(month) print(year) return HttpResponse ('my app01')
- Django 版本区别
2+版本的re_path 就是1+版本的url
2+版本多了一个path,不支持正则
4. 反向解析
- 作用:修改路由中的URL时,其他地方无需改动也可访问原来的地址
- 导入模块
from django.shortcuts import reverse
- 在视图函数中
urls文件:
url(r'^test',views.test2),
#绑定name='n',即使访问地址改变也可以找到
url(r'^index555/',views.index,name='n'),
views 文件:
def test2(request): url=reverse('n') #通过reverse()得到改变过后的地址 /index555/ (原来的地址是index) print(url) #将url(改变后的地址)传入,返回之前的信息 '我是index' return redirect(url) # return HttpResponse ('hhhhhhhhhh') def index(request): return HttpResponse ('我是index')
- 在模板中使用
{% url 'n1'%}
- 带位置参数
url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,))
模板:{% url 'n1' 2012 12 %}
注:按顺序传顺序是固定的
- 带关键字参数
url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'), 视图:url=reverse('n1',args=(2012,12,) 或者 url=reverse('n1',kwargs={'year':2014,'month':12}) 模板: {% url 'n1' 2012 12 %}----可以 {% url 'n1' month=12 year=2012 %}----可以 5. 名称空间
- 反向解析时,不同的app文件的url中name指定的名字相同 那么在路由分发时可以指定名称空间namespace='app01'
6. Django 2.0+ 版本
- django2.0的re_path和1.0的url一样
- path
导入:
from django.urls import path
#不支持正则,精准匹配
#有五个转换器
(1)str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
(2)int,匹配正整数,包含0。
(3)slug,匹配字母、数字以及横杠、下划线组成的字符串。
(4)uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
(5)path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
用法:
path('index/<int:year>',views.index)
-----------------------------------
注:在<>内指定转换器和参数,根据转换器规则匹配;
如果没有转换器将匹配任意字符;
无需添加前导斜杠
- 注册自定义转换器
class Test: regex='[a-z]{3}' def to_python(self,value): return str(value) def to_url(self,value): return '%03s' %value # 定义个转化器msg,注册到url配置中 register_converter(Test,'msg') urlpatterns = [ path('index/<msg:y>',views.index) ]
(1)regex 类属性,字符串类型
(2)to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
(3)to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。