Django 2.0:Path converter的用法

栏目: Python · 发布时间: 7年前

内容简介:Django 2.0:Path converter的用法

Django2.0于2017年12月2日已经正式发布。Django2.0支持 Python 3.4,3.5以及3.6,移除了对Python2.7的支持。官方强烈建议Python 3.x使用最新的版本。

在Django2.0其中一个新特性为: 简化Url路由的语法

在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:

原来的url

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

Django2.0新语法

path('articles/<int:year>/', views.year_archive),

新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。

在Django1.x里,我们需要对year做类型转换:

def year_archive(request, year):
    year = int(year)

URL参数捕获

在新的语法里,url字符串有以下规则:

  1. 在url里使用尖括号“<>”来捕获值
  2. 尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
  3. url不需要以斜杠开头。

代码示例

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:slug>/', views.article_detail),
]

匹配示例

  • /articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
  • /articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
  • /articles/2003:没有匹配到规则,原因是所有的规则都是以斜杠结尾
  • /articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)

Path Converter

url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。

默认Path converter

Django2.0自带的PathConveter包括:

  • str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
  • int:匹配0及正整数。
  • slug:匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid:匹配格式化的uuid,如  075194d3-6885-417e-a8a8-6c931e272f00
  • path:匹配任何非空字符串,包含了路径分隔符(/)

注册自定义Path Converter

当默认的Path Converter不能满足需求时,Django2.0支持用户注册自定义的Path Converter。

Path Converter是一个类,定义Converter类需要包含下面的属性或方法:

  • regex属性,字符串类型
  • to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。
  • to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。

示例

定义Path Converter

class FourDigitYearConverter:
    regex = '[0-9]{4}'

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

    def to_url(self, value):
        return '%04d' % value

使用 register_converter() 注册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),
    ...
]

正则表达式匹配

Django2.0也支持我们使用正则表达式来捕获值。注意,用正则表达式捕获值,需要使用 re_path() ,而不是前面介绍的path()。

正则表达式建议使用命名正则表达式组,语法如下:

(?P<name>pattern)

其中,尖括号里的name为分组名,pattern为正则表达式。

前面的示例可以使用正则表达式修改为:

from django.urls import path, re_path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-_]+)/', views.article_detail),
]

与前面的示例不同点:

  • 这里的代码匹配更加严格,比如year为10000就无法匹配,因为它超出了正则规定的4位数
  • 传给view函数的参数为字符串类型,这点和 Django使用url 是一样的。

设置默认值

在path里支持对view设置默认值。

from django.urls import path

from . import views

urlpatterns = [
    path('blog/', views.page),
    path('blog/page<int:num>/', views.page),
]

# View (in blog/views.py)
def page(request, num=1):
    # Output the appropriate page of blog entries, according to num.
    ...

page函数num的默认值设置为1.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ASP.NET 2.0入门经典

ASP.NET 2.0入门经典

哈特 / 清华大学出版社 / 2006-8 / 78.00元

该书是Wrox红皮书中的畅销品种, 从初版、1.0版、1.1版到目前的2.0版,已经3次升级,不仅内容更加完善、实用,还展现了.NET 2.0的最新技术和ASP.NET 2.0最新编程知识,是各种初学者学习ASP.NET的优秀教程,也是Web开发人员了解ASP.NET 2.0新技术的优秀参考书。该书与《ASP.NET 2.0高级编程(第4版)》及其早期版本,曾影响到无数中国Web程序员。一起来看看 《ASP.NET 2.0入门经典》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具