Django——路由
1、路由分发
可以在每个应用中创建一个 urls.py 进行在该应用中的路由匹配。
# include 在根目录路由中对应用的路由进行分发 # 对 UrlApp 应用分发一个 路由配置 path('urlapp/' , include('UrlApp.urls')), path('urlapp2/' , include('UrlApp2.urls'))
2、匹配路由
1、使用正则表达式
re_path 方法是使用正则定义 url
在需要对应用户的数据进行验证的时候,会使用正则表达式匹配路由
# 使用正则表达式匹配路由的时候必须匹配开头以及结尾(^正则表达式/$) re_path(r'^[A-Z0-9]+/$' , views.re_views),
2、URL参数传递
在 path 解析 url 中携带的参数,使用 来获取路由中对应位置的数据。url接收到这个参数之后,会传递给对应关系的视图。
# 获取 url 中的参数 path('demo/<urldata>/' , views.get_url_data),
def get_url_data(request , urldata): return HttpResponse(f'从 url 中获取到的参数为: {urldata}')
url 映射中的 path 和 re_path 方法可以传入第三个参数,这个参数会作为请求的附加数据,在项目中这个附加数据会一起传递给对应的视图函数。
这个附加数据必须以字典的形式写入
# 在 url 映射方法中携带附加数据 path('extra/' , views.extra , {'age':27}), path('default/' , views.default_data), path('default/<data>/' , views.default_data),
def extra(request , age): return HttpResponse(f'获取 url 映射方法中的附加数据:{age}') def default_data(request , data=369): # 当匹配的 url 有获取到同名的参数的情况,该默认数据会被覆盖。 return HttpResponse(f'从 url 中获取到的参数为: {data}')
3、路由转换器
转换器的本质上也是使用正则进行匹配
# 转换器写法:<转换器名称:参数名> # int: 匹配0以及正整数。获取到的数据会被解析为int类型 path('int/<int:data>/' , views.int_view), # str : 匹配除了 URl 分隔符(/) 之外的非空字符串 path('str/<str:data>/' , views.str_view), # path : 匹配任意非空字符 path('path/<path:data>/' , views.path_view), # slug: 匹配字母, 数字 , 下划线 ,横杆组成的字符串 path('slug/<slug:data>/' , views.slug_view),
def int_view(request , data): print(type(data)) return HttpResponse(f'使用 int 转换器 , 接收到的数据为:{data}') def str_view(request , data): return HttpResponse(f'使用 str 转换器 , 接收到的数据为:{data}') def path_view(request , data): return HttpResponse(f'使用 path 转换器 , 接收到的数据为:{data}') def slug_view(request , data): return HttpResponse(f'使用 slug 转换器 , 接收到的数据为:{data}')
3、反向解析路由
在 html 模板中用反向解析获取访问视图完整 URl 路径 , 需要给 url定义一个名称(给 url 起别名)
在 html 模板中反向解析路由的格式 : {% url 'URL的模式名称' 参数%}
<body> <a href="/urlapp2/index/">点击开奖</a><br> <a href="{% url 'num' %}">点击开奖,无奖竞猜</a> <a href="{% url 'name_data' '尔康'%}">不要点击</a> </body>
path('html/' , views.html_view), path('index/' , views.index), path('num/' , views.number_view , name='num'), path('name/<data>/' , views.data_view , name='name_data'),
def index(request): return HttpResponse('我不好') def html_view(request): return render(request , 'UrlDemo.html') def number_view(request): number = randint(136 , 569) return HttpResponse(f'中奖号码为:{number}') def data_view(request , data): return HttpResponse(f'{data} 是这个直播间最帅的!')
在后端视图中解析路由 , reverse(url模式名称)
def text(request): # 导入 reverse 解析路由方法 return HttpResponse(f'视图解析路由为:{reverse("num")}') def redirect_reverse(request): # return redirect(reverse('num')) # url 中的 name 解析名称可以直接在 redirect 中直接使用 return redirect('num') def text_data(request , data): # reverse(url名称 , args=[参数]/kwargs={参数}) # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}') return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=[data])}')
path('text/' , views.text), path('demo/' , views.redirect_reverse), path('text_data/' , views.text_data), path('text_data/<data>/' , views.text_data),
4、url的应用名称空间
在 应用的 urls.py 文件中 , 定义一个 app_name 的属性
# 定义当前应用的 url 应用名称空间 app_name = 'app2'
<!-- 当后端给 url 定义了应用名称空间之后 在 html 中进行反向解析的时候,必须指定到那一个应用名称空间下查找 {# {% url 'url应用名称空间:url名称' 参数%} #} --> <a href="{% url 'app2:num' %}">点击开奖,无奖竞猜</a> <a href="{% url 'app2:name_data' '尔康'%}">不要点击</a>
def text(request): # 导入 reverse 解析路由方法 return HttpResponse(f'视图解析路由为:{reverse("app2:num")}') def redirect_reverse(request): # return redirect(reverse('num')) # url 中的 name 解析名称可以直接在 redirect 中直接使用 return redirect('app2:num') def text_data(request , data): # reverse(url名称 , args=[参数]/kwargs={参数}) # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}') return HttpResponse(f'视图解析路由为:{reverse("app2:name_data" , args=[data])}')