django 重温自定义路径转换器

路由传递位置参数

在django2.x以上版本中有了新玩法——路由传递位置参数。如下所示:

urlpatterns = [
    path('test/<int:number>/', views.test)
]

绑定如上路由,假定上面路径是写在主路由下,当我们访问 127.0.0.1/test/1534/ 时,可以将url中的1534转换为整型,并将其传递给视图下的test函数,这样我们就能直接使用了!

目前django主要封装了以下几个路径转换器。

  • str:匹配除路径分隔符外的任何非空字符串。
  • int:匹配0或者任意正整数。
  • slug:匹配任意一个由字母或数字组成的字符串。
  • uuid:匹配格式化后的UUID。
  • path:能够匹配完整的URL路径。

自定义路由路径转换器

定义

可以看到,尽管django已经为我们提供了不少常用的转换器,但在实际应用中是远远不够的,比如需要匹配一个电话号码呢?这时候就需要我们自行定义了。
在这里插入图片描述

我们在与工程目录同名的子目录下,创建一个utils的package包,并在里面创建一个叫route_converter的py文件。

我们在 route_converter py文件中进行如下定义:

class RouteYearConverter:
    """自定义手机号判断类型转换器"""
    regex = '1[3-9]\d{9}'  # 不需要在开头加^也不需要在结尾加$

    def to_python(self, value):
        return str(value)

    def to_url(self, value):
        return str(value)

在 RouteYearConverter 类中,属性 regex 与 函数 to_python、to_url 均为固定写法。regex属性是一个用字符串表示的正则表达式。to_python(self,value)函数用于将接收到的数据进行转换并传递给绑定的视图处理函数处理,如果数据转换失败,则会抛出ValueError错误;to_url(self,value)函数用于将python中对应烈性的数据转换成字符串,用作URL。当然,涉及到更复杂的操作时我们还能够在两个函数内部继续对value进行处理,并将结果返回。

注册

定义好路径转换器后还得注册才能使用,而且需要在urls.py中注册。进入您的url.py文件中,因为每个人的配置不一样所以可以根据自身情况来写。

from django.urls import path
from verifications import views
from django.urls import register_converter
from meiduomall.utils.route_converter import RouteYearConverter

register_converter(RouteYearConverter, 'mobile')  # 命名为mobile

urlpatterns = [
    path('test/<mobile:number>/', views.test)
]

虽然看起来有点长,但实际用的就两行代码。首先需要用 register_converter 对刚才定义的类进行注册,接着就是平时怎么用的现在就是怎么用了。还有就是别忘了在视图里写上参数名噢!

def test(request, number):
    return HttpResponse(f'{
      
      number}')

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lishuaigell/article/details/125242550