千家信息网

Django如何实现自定义路由转换器

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍Django如何实现自定义路由转换器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!django内置的路径转换器源码解析在我们自定义路由转换器之前,我们先查看一下
千家信息网最后更新 2025年01月23日Django如何实现自定义路由转换器

这篇文章主要介绍Django如何实现自定义路由转换器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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

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

import convertersclass 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 value    def 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 value    def to_url(self, value):        return 'd' % value

在urls.py文件下注册自定义的转换器

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

以上是"Django如何实现自定义路由转换器"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0