AI智能
改变未来

Django(6)自定义路由转换器


自定义路径转换器

有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器

django内置的路径转换器源码解析

在我们自定义路由转换器之前,我们先查看一下django内置的那些路由转换器怎么写的,源码路径

from django.urls import converters

class IntConverter:regex = \'[0-9]+\'def to_python(self, value):return int(value)def to_url(self, value):return str(value)class StringConverter:regex = \'[^/]+\'def to_python(self, value):return valuedef to_url(self, value):return valueclass UUIDConverter:regex = \'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\'def to_python(self, value):return uuid.UUID(value)def to_url(self, value):return str(value)class SlugConverter(StringConverter):regex = \'[-a-zA-Z0-9_]+\'class PathConverter(StringConverter):regex = \'.+\'DEFAULT_CONVERTERS = {\'int\': IntConverter(),\'path\': PathConverter(),\'slug\': SlugConverter(),\'str\': StringConverter(),\'uuid\': UUIDConverter(),}REGISTERED_CONVERTERS = {}def register_converter(converter, type_name):REGISTERED_CONVERTERS[type_name] = converter()get_converters.cache_clear()

从上面我们可以非常分析的看到,django内置的路径转换器是先定义了一个类,类中定义了一个类属性

regex

作为正则表达式的值,然后定义了2个方法

to_python

to_url

,最后定义了一个

register_converter

函数,将路径转换器注册到django中去
我们这里给他划分为5步:

  • 1.创建一个
    converters.py

    ,在文件中定义一个类。

  • 2.在类中定义一个属性
    regex

    ,这个属性是用来保存url转换器规则的正则表达式。

  • 3.实现
    to_python(self,value)

    方法,这个方法是将url中的值转换一下,然后传给视图函数的。

  • 4.实现
    to_url(self,value)

    方法,这个方法是在做url反转的时候,将传进来的参数转换后拼接成一个正确的url。

  • 5.将定义好的转换器,注册到django中。

小案例

接下来我们自己定义一个转换器,满足4位数字的路径匹配
新建一个converters.py文件,代码如下:

class FourDigitYearConverter:# 定义正则表达式regex = \'[0-9]{4}\'def to_python(self, value):return valuedef to_url(self, value):return \'%04d\' % value

urls.py

文件下注册自定义的转换器

from django.urls import path,  converters# 注册自定义转换器register_converter(converters.FourDigitYearConverter, \'yyyy\')  # yyyy是自定义转换器的类型名称urlpatterns = [path(\'articles/<yyyy:year>\', views.articles_yyyy),]

这样我们就可以匹配4位数字的url地址了

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Django(6)自定义路由转换器