美文网首页Django入门开发实战
路由控制补充--基于Django 2.0+版本

路由控制补充--基于Django 2.0+版本

作者: 乔治大叔 | 来源:发表于2018-12-10 17:34 被阅读21次

django2.0的re_path和1.0的url一样

思考情况如下:

urlpatterns = [  
    re_path('articles/(?P<year>[0-9]{4})/', year_archive),  
    re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view),  
    re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view),  
    re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', delete_view),  
]

考虑下这样的两个问题:

第一个问题,函数 year_archive 中year参数是字符串类型的,因此需要先转化为整数类型的变量值,当然year=int(year) 不会有诸如如TypeError或者ValueError的异常。那么有没有一种方法,在url中,使得这一转化步骤可以由Django自动完成?

第二个问题,三个路由中article_id都是同样的正则表达式,但是你需要写三遍,当之后article_id规则改变后,需要同时修改三处代码,那么有没有一种方法,只需修改一处即可?

在Django2.0中,可以使用 path 解决以上的两个问题。

基本示例

这是一个简单的例子:

from django.urls import path  
from . import views  
urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<int:year>/', views.year_archive),  
    path('articles/<int:year>/<int:month>/', views.month_archive),  
    path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),  

  # path才支持,re_path不支持
  path('order/<int:year>',views.order),
]

基本规则:

  • 使用尖括号(<>)从url中捕获值。
  • 捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
  • 无需添加前导斜杠。

以下是根据 2.0官方文档 而整理的示例分析表:(跟上面url的匹配关系)

image.png

path转化器

文档原文是Path converters,暂且翻译为转化器。

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

注册自定义转化器

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型

  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。

  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

例子:

class FourDigitYearConverter:  
    regex = '[0-9]{4}'  
    def to_python(self, value):  
        return int(value)  
    def to_url(self, value):  
        return '%04d' % value  

使用register_converter 将其注册到URL配置中:

from django.urls import register_converter, path  
from . import converters, views  
register_converter(converters.FourDigitYearConverter, 'yyyy')  
urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<yyyy:year>/', views.year_archive),  
    ...  
]

相关文章

  • 路由控制补充--基于Django 2.0+版本

    django2.0的re_path和1.0的url一样 思考情况如下: 考虑下这样的两个问题: 第一个问题,函数 ...

  • RESTful API实现

    基于Django实现RESTful API 路由 视图 结果 基于Django REST Framework框架实...

  • Spark之RDD和Dataset转换

    版本 基于Spark 2.0+以上版本。scala ,java案例不多,记录下java代码进行RDD和datase...

  • 优雅的构建Android项目之RxAndroid+Retrofi

    注意 Retrofit 2.0+和Retrofit 2.0之前的版本语法上有差别,本文基于Retrofit2.1....

  • xadmin学习之路

    前言 django 2.0+使用xadmin要修改源码,为后期项目不受影响,尽量使用2.1以下(我使用的版本是2....

  • RxJava(2.0)-订阅源码分析

    基于RxJava 2.0+版本,对RxJava的订阅源码进行简单分析。 1. 使用实例 我们在使用RxJava2....

  • Routers - Django REST framework

    路由器-Django REST框架 routers.py 路由器 资源路由允许您快速声明给定的足智多谋控制器的所有...

  • Django--路由控制

    一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要...

  • Django drf版本控制

    源码流程 和认证的流程一样,进入initial(request)在认证,权限,节流前先执行了这两句函数,获取到ve...

  • django框架进阶

    @[toc] Django的URL路由机制 Django的URL路由配置 路由是关联URL及其处理函数关系的过程 ...

网友评论

    本文标题:路由控制补充--基于Django 2.0+版本

    本文链接:https://www.haomeiwen.com/subject/cujdhqtx.html