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}')