Django——路由

Django------路由

1、路由分发

可以在每个应用中创建一个 urls.py 进行在该应用中的路由匹配。

python 复制代码
# include 在根目录路由中对应用的路由进行分发
# 对 UrlApp 应用分发一个 路由配置
path('urlapp/' , include('UrlApp.urls')),
path('urlapp2/' , include('UrlApp2.urls'))

2、匹配路由

1、使用正则表达式

re_path 方法是使用正则定义 url

在需要对应用户的数据进行验证的时候,会使用正则表达式匹配路由

python 复制代码
# 使用正则表达式匹配路由的时候必须匹配开头以及结尾(^正则表达式/$)
re_path(r'^[A-Z0-9]+/$'  , views.re_views),

2、URL参数传递

在 path 解析 url 中携带的参数,使用 来获取路由中对应位置的数据。url接收到这个参数之后,会传递给对应关系的视图。

python 复制代码
# 获取 url 中的参数
path('demo/<urldata>/' , views.get_url_data),
python 复制代码
def get_url_data(request , urldata):
    return HttpResponse(f'从 url 中获取到的参数为: {urldata}')

url 映射中的 path 和 re_path 方法可以传入第三个参数,这个参数会作为请求的附加数据,在项目中这个附加数据会一起传递给对应的视图函数。

这个附加数据必须以字典的形式写入

python 复制代码
# 在 url 映射方法中携带附加数据
path('extra/' , views.extra , {'age':27}),

path('default/' , views.default_data),
path('default/<data>/' , views.default_data),
python 复制代码
def extra(request , age):
    return HttpResponse(f'获取 url 映射方法中的附加数据:{age}')

def default_data(request , data=369):
    # 当匹配的 url 有获取到同名的参数的情况,该默认数据会被覆盖。
    return HttpResponse(f'从 url 中获取到的参数为: {data}')

3、路由转换器

转换器的本质上也是使用正则进行匹配

python 复制代码
# 转换器写法:<转换器名称:参数名>
# 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),
python 复制代码
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的模式名称' 参数%}

html 复制代码
<body>
<a href="/urlapp2/index/">点击开奖</a><br>
<a href="{% url 'num' %}">点击开奖,无奖竞猜</a>
<a href="{% url 'name_data' '尔康'%}">不要点击</a>
</body>
python 复制代码
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'),
python 复制代码
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模式名称)

python 复制代码
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])}')
python 复制代码
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 的属性

python 复制代码
# 定义当前应用的 url 应用名称空间
app_name = 'app2'
html 复制代码
<!--
    当后端给 url 定义了应用名称空间之后
    在 html 中进行反向解析的时候,必须指定到那一个应用名称空间下查找
    {# {% url 'url应用名称空间:url名称' 参数%} #}
-->
<a href="{% url 'app2:num' %}">点击开奖,无奖竞猜</a>
<a href="{% url 'app2:name_data' '尔康'%}">不要点击</a>
python 复制代码
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])}')
相关推荐
oradh1 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789862 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD2 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
Ai_easygo3 小时前
MCP 协议实战:用 Claude Desktop 连本地 SQLite,5 分钟搭一个能查数据的 AI 助手
jvm·人工智能·sqlite
TlSfoward3 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记4 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发4 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB4 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88204 小时前
Mysql并发DML锁等待的优化
数据库·mysql
Database_Cool_5 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云