Django——路由2
1、路由分发
在开发中可以会有很多个应用 , 把所有的路由都写在根目录的urls中是不现实。
在每一个应用中都自带创建一个urls进行路由的配置 , 但是浏览器要进行访问该应用中路由,需要通过根目录中的urls路由入口进行访问。
# 只要路由是从app02开始的 , 都指向app02这个应用中的urls文件进行查询
path('app02/' , include('app02.urls')),
path('app03/' , include('app03.urls'))
2、路由配置
1、使用正则表达式
re_path函数是使用正则表达式定义url模式
re_path(r'^\d{2,}$' , views.NumberInUrl),
re_path(r'^[A-Za-z]+$' , views.charurl)
2、URL参数传递
使用path函数解析url的时候 , 可以通过<name>
来捕获url路径中对应位置的的数据 , 接收到数据之后会传递给对应映射关系的视图函数中
path('text/<url_data>/' , views.getData),
path('text/<data1>/<data2>/' , views.getData2)
def getData(request , url_data):
return HttpResponse(f'从URL中获取到的数据为:{url_data}')
def getData2(request , data1 , data2):
return HttpResponse(f'从URL中获取到的数据为:{data1} 和 {data2}')
路由转换器
django中url路径获取的数据解析默认是字符串 , 可以使用转换器来完成一些指定类型的转换。
转换器
str:匹配出来路由中分隔符/之外的非空字符串
int:匹配0以及正整数。获得的数据类型为int
slug:匹配字母 , 下划线 , 数字 , 横杠组成的字符串
path:匹配任何非空的字符
path('data1/<str:data>', views.getdata1),
path('data2/<int:data>', views.getdata2),
path('data3/<slug:data>', views.getdata3),
path('data4/<path:data>', views.getdata4),
def getdata1(request , data):
print(type(data))
return HttpResponse(f'使用str转换器 , 数据为:{data}')
def getdata2(request , data):
print(type(data))
return HttpResponse(f'使用int转换器 , 数据为:{data}')
def getdata3(request , data):
print(type(data))
return HttpResponse(f'使用slug转换器 , 数据为:{data}')
def getdata4(request , data):
print(type(data))
return HttpResponse(f'使用path转换器 , 数据为:{data}')
在配置路由时也可以在path或者re_path的第三个参数位置写上 , 为视图函数传递附加数据.
在视图函数中定义参数自带了默认值 , 要调用默认值参数的视图函数;在url中定义一个带参的url和不带参的url来映射这个视图函数。
当访问的url是不带参数的 , 那么视图函数参数就使用默认值;
当访问url是带有参数的 , 那么视图函数的参数会直接获取url传递的参数进行使用。
# 附加数据{'ex':456}
path('extra/<data>/' , views.extra, {'ex':456}),
# 不带参数的url
path('default/' , views.default_data),
# 带参数的url
path('default/<data>/', views.default_data),
def extra(request , data , ex):
return HttpResponse(f'从URl中获取的数据:{data} , 附加数据:{ex}')
def default_data(request , data=123):
return HttpResponse(f'视图函数default_data的默认参数为data=123 , 当前的data值为:{data}')