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.