django 学习笔记-路由进阶
路由进阶
在django中所有的路由最后都会被保存到一个变量urlpatterns=列表里面.
在给urlpatterns路由列表添加路由的过程 中,django一共提供了2个函数个开发者注册路由.
from django.urls import path, re_path
# 路由使用过程中,django提供了2个函数给我们把url和视图进行绑定映射,
django.urls.path("字符串url地址", 视图函数, name="路由别名") # 字符串路由
django.urls.re_path("正则字符串url地址", 视图函数, name="路由别名") # 正则路由
# path 和 re_path 使用参数一致,仅仅在url参数和接收参数是不一样.
path注册路由
子应用urls.py代码
from django.urls import path,re_path
# path("路由url","视图函数","路由别名"),
path("index.html4", views.index4,name="index4" ),
re_path注册路由
子应用urls.py代码
from django.urls import path,re_path
from . import views
urlpatterns = [
# 错误写法:
# 访问地址: http://127.0.0.1:8000/book/51/55.html
# 第二个url路由永远都不会被访问到,因为55.html先命中第一个路由正则模式了
# re_path("(?P<pk>\d+)\.html", views.detail1),
# re_path("(?P<cat>\d+)/(?P<pk>\d+)\.html", views.detail2),
# # 正确写法,写上模式开始符号(^) 和 模式的结束符号($)
# re_path("^(?P<pk>\d+)\.html$", views.detail1),
# re_path("^(?P<cat>\d+)/(?P<pk>\d+)\.html$", views.detail2),
#
# # 路由后缀添加斜杠结尾,在用户访问该url时如果不加斜杠结尾方法,则django会自动在用户访问的路径后面自动补充斜杠
# # 路由后缀不添加斜杠结尾,则用户访问该url时如果添加了斜杠结尾,则django会报错!
# re_path("(?P<id>\d+).html/", views.index3),
#
# # 内置路由转换器
# # 只有在path中才能使用路由转换器
# # 默认情况下,对于正则路由中提供的路由参数,全部都是字符串格式的
# # re_path("index4/(?P<id>\d+).html", views.index4),
# # 希望获取的数值是数字,int类型的,就可以内置路由转换器
# path("index5/<int:id>.html", views.index5),
# # uuid格式
# # http://127.0.0.1:8000/book/sms/06bd1230-40c6-4698-8df8-f2189a776343
# path("sms/<uuid:code>", views.index6),
# 匹配手机号码的路由参数
# re_path("^sms/(?P<mobile>1[3-9]\d{9})$", views.index7),
# 把手机的正则路由匹配改写成路由转换器
# 一般负责的正则路由都会把正则路由编写成路由转换器,写在外部文件中,导包引入使用
path("sms/<mob:mobile>", views.index7),
]
视图代码中接收正则 路由的参数
子应用views.py代码
from django.shortcuts import render # 返回HTML
from django.http.response import HttpResponse # 返回字符串
from django.views.decorators.http import require_http_methods
def index1(request):
return HttpResponse("path注册的路由对应的视图")
def detail1(request,pk):
return HttpResponse(f"id={pk}的虚拟商品页面")
def detail2(request,pk,cat):
return HttpResponse(f"分类={cat},并id={pk}的实体商品页面")
def index3(request,id):
return HttpResponse("<img src='1.png'>")
路由路径加斜杠/的问题:
路由实际上就是url地址和应用程序进行一对一绑定的关系.
url: 统一资源定位标记.表示了一个事物[可以是任意的互联网里面的信息或者文件]在网络中的位置.
在django路由中,编写url地址时为了快速查找, 建议最好加上 / 在路由的后面. 但是用户访问对应视图的路由时, 加不加斜杠, django都能识别.
path('index/',views.index) re_path("goods/(?P<id>\d+)/", views.index3),
路由转换器
路由转换器也可以叫路由验证器,有2个作用:
把路由参数进行类型转换
也可以起到验证路由匹配的作用
内置转换器
子应用urls.py代码
# 路由中使用
urlpatterns = [
path('sms/<int:mobile>', views.send_sms)
]
自定义转换器
在当前子应用下新建converters.py下编写的,这里是我们刚学习,所以为了方便直接在路由urls.py下编写,代码:
"""子应用路由"""
from django.urls import path,re_path
# 路由使用过程中,django提供了2个函数给我们把url和视图进行绑定映射,
# django.urls.path("字符串url地址", 视图函数, name="路由别名")
# django.urls.re_path("正则字符串url地址", 视图函数, name="路由别名")
from . import views
# 自定义路由转换器
class MobileConverter(object):
regex = "1[3-9]\d{9}"
def to_python(self,value):
"""把路由上面的内容转换成python数据,并转换类型"""
# 将匹配结果传递到视图内部时使用
return value
def to_url(self,value):
# 将匹配结果用于反向解析传值时使用
return value
from django.urls import register_converter
# register_converter(路由转换器类名, "使用别名")
register_converter(MobileConverter, "mob")
urlpatterns = [
# 匹配手机号码的路由参数
# re_path("^sms/(?P<mobile>1[3-9]\d{9})$", views.index7),
# 把手机的正则路由匹配改写成路由转换器
# 一般负责的正则路由都会把正则路由编写成路由转换器,写在外部文件中,导包引入使用
path("sms/<mob:mobile>", views.index7),
]
子应用视图views.py代码
def index7(request,mobile):
return HttpResponse("ok. index7")

浙公网安备 33010602011771号