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),

image-20210528202821816

路由转换器

路由转换器也可以叫路由验证器,有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")
posted @ 2021-05-31 22:43  豆#豆  阅读(70)  评论(0)    收藏  举报