Django2.0于2017年12月2日已经正式发布。Django2.0支持Python3.4,3.5以及3.6,移除了对Python2.7的支持。官方强烈建议Python 3.x使用最新的版本。前端
在Django2.0其中一个新特性为:简化Url路由的语法。python
在代码上主要体如今新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:git
原来的url正则表达式
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
Django2.0新语法django
path('articles/<int:year>/', views.year_archive),
新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数做为参数,而且会自动转换year为整型而不是字符串。app
在Django1.x里,咱们须要对year作类型转换:函数
def year_archive(request, year): year = int(year)
在新的语法里,url字符串有如下规则:ui
代码示例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), ]
匹配示例spa
url里捕获的值使用Path Converter来对值作转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。
Django2.0自带的PathConveter包括:
例子: path('image_codes/<uuid>', views.xxxx) image_codes是前缀,<uuid>是django自带的配合器写法,获得的是一个UUID对象, 在视图方法中经过参数来接受这个 uuid 例如: def get(self,request,uuid) 能够打印这个UUID 获得是一个前端传过来的uuid.
当默认的Path Converter不能知足需求时,Django2.0支持用户注册自定义的Path Converter。
Path Converter是一个类,定义Converter类须要包含下面的属性或方法:
示例
定义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), ]
与前面的示例不一样点:
在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.