您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關使用方面Django2.0在url有哪些改變,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Django2.0發布后,很多人都擁抱變化,加入了2的行列。
但是和1.11相比,2.0在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),]
注意:
要捕獲一段url中的值,需要使用尖括號,而不是之前的圓括號;可以轉換捕獲到的值為指定類型,比如例子中的int。默認情況下,捕獲到的結果保存為字符串類型,不包含/這個特殊字符;匹配模式的最開頭不需要添加/,因為默認情況下,每個url都帶一個最前面的/,既然大家都有的部分,就不用浪費時間特別寫一個了。
匹配例子:
/articles/2005/03/ 將匹配第三條,并調用views.month_archive(request, year=2005, month=3);
/articles/2003/匹配第一條,并調用views.special_case_2003(request);
/articles/2003將一條都匹配不上,因為它最后少了一個斜杠,而列表中的所有模式中都以斜杠結尾;
/articles/2003/03/building-a-django-site/ 將匹配最后一個,并調用views.article_detail(request, year=2003, month=3, slug="building-a-django-site"
二、path轉換器
默認情況下,Django內置下面的路徑轉換器:
str:匹配任何非空字符串,但不含斜杠/,如果你沒有專門指定轉換器,那么這個是默認使用的;
int:匹配0和正整數,返回一個int類型
slug:可理解為注釋、后綴、附屬等概念,是url拖在最后的一部分解釋性字符。該轉換器匹配任何ASCII字符以及連接符和下劃線,比如’ building-your-1st-django-site‘;
uuid:匹配一個uuid格式的對象。為了防止沖突,規定必須使用破折號,所有字母必須小寫,例如’075194d3-6885-417e-a8a8-6c931e272f00‘ 。返回一個UUID對象;
path:匹配任何非空字符串,重點是可以包含路徑分隔符’/‘。這個轉換器可以幫助你匹配整個url而不是一段一段的url字符串。
三、自定義path轉換器
其實就是寫一個類,并包含下面的成員和屬性:
類屬性regex:一個字符串形式的正則表達式屬性;
to_python(self, value) 方法:一個用來將匹配到的字符串轉換為你想要的那個數據類型,并傳遞給視圖函數。如果轉換失敗,它必須彈出ValueError異常;
to_url(self, value)方法:將Python數據類型轉換為一段url的方法,上面方法的反向操作。
例如,新建一個converters.py文件,與urlconf同目錄,寫個下面的類:
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value
寫完類后,在URLconf 中注冊,并使用它,如下所示,注冊了一個yyyy:
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的url雖然改‘配置’了,但它依然向老版本兼容。而這個兼容的辦法,就是用re_path()方法代替path()方法。re_path()方法在骨子里,根本就是以前的url()方法,只不過導入的位置變了。下面是一個例子,對比一下Django1.11時代的語法,有什么太大的差別?
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()方法不同的在于兩點:
year中匹配不到10000等非四位數字,這是正則表達式決定的傳遞給視圖的所有參數都是字符串類型。而不像path()方法中可以指定轉換成某種類型。在視圖中接收參數時一定要小心。
五、總結
除了上面的部分,Django2.0路由系統其它的知識點和Django1.11的基本都是相同的,就是在寫法上面有那么點小小的區別。
你只需要使用from django.urls import re_path正確導入re_path()方法,并用它替換url()方法就可以了。
看完上述內容,你們對使用方面Django2.0在url有哪些改變有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。