django动态路由_路由器和转换器的区别

django动态路由_路由器和转换器的区别自定义路径转换器有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器django内置的路径转换器源码解析在我们自定义路由转

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

自定义路径转换器

有时候上面的内置的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 value

    def to_url(self, value):
        return value


class 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_pythonto_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 '%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地址了
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/165054.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • sqlserver怎么用语句创建表_mysql查询表的创建语句

    sqlserver怎么用语句创建表_mysql查询表的创建语句原文地址:http://database.51cto.com/art/201010/231018.htmSQLServer创建表是最常见也是最常用的操作之一,下面就为您介绍SQLServer创建表的语句写法,供您参考,希望可以让您对SQLServer创建表方面有更深的认识。USE suntest create table 仓库 ( 仓库编号 int ,  仓库

    2022年10月17日
  • map平均准确率_拓扑排序怎么排

    map平均准确率_拓扑排序怎么排给定一张 N 个点 M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数 N,M,接下来 M 行每行两个整数 x,y,表示从 x 到 y 的一条有向边。输出格式输出共 N 行,表示每个点能够到达的点的数量。数据范围1≤N,M≤30000输入样例:10 103 82 32 55 95 92 33 94 82 104 9输出样例:1633211111#include<bits/stdc++.h>using

  • 谈谈数据库编程语言和其他编程语言的区别_数据库编程

    谈谈数据库编程语言和其他编程语言的区别_数据库编程要说清这个目标,先要理解数据库是做什么的。数据库这个软件,名字中有个“库”字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两条:计算、事务!也就是我们常说的OLAP和OLTP,数据库的存储都是为这两件事服务的,单纯的存储并不是数据库的目标。我们知道,SQL是目前数据库的主流语言。那么,用SQL做这两件事是不是很方便呢?事务类功能主要解决数据在写入和读出时要保持的一致性,实现这件事的难度并不小,但对于应用程序的接口却非常简单,用于操纵数据库读写的代码也很简单。如果假定目前关系数据库的逻辑存储

  • Bug驱动开发(Bug-driven development)

    Bug驱动开发(Bug-driven development)

  • Stm32的GPIO驱动继电器[通俗易懂]

    Stm32的GPIO驱动继电器[通俗易懂]三极管三极管S8050-D:直插的字体面向自己从左到右依次是发射极E,基极B,集电极C类型:NPN集电极耗散功率Pc:0.625W(贴片:0.3W)集电极电流Ic:0.5A集电极-基极电压Vcbo:40V集电极-发射极电压Vceo:25V集电极-发射极饱和电压Vce(sat):0.6V特征频率f:最小150MHz按三极管后缀号分为BCD档贴片为LH档放大倍数:B85-160C120-200D160-300L100-200H200-350上图中,左边的GPIO

  • 树莓派3B 开箱配置

    树莓派3B 开箱配置概述最近看到淘宝推荐有树莓派3B+,价格和3B一样,增加了千兆网络,和5GWifi,性能也有一些提升,然后就下单买了。可是没看清楚介绍,原来3B+是预售,不是马上有货,然后那家店的3B+是单独预售购买的,如果点了套装,实际上卖的是3B。于是满怀兴奋的拆开快递后,呈现一脸懵B状态。本来纠结要不要退货重买,不过想想其实性能也不是差距十分大,既然都收到了,不如先研究一番,等到19年树莓派4出的时候…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号