django2.0 path使用方法

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參數捕獲

在新的語法裏,url字符串有如下規則:ui

  1. 在url裏使用尖括號「<>」來捕獲值
  2. 尖括號捕獲值的格式<converter:name>。其中converter爲路徑轉換器,name爲參數名,如<int:year>。對於捕獲的值沒有路徑轉換器,那麼它會匹配除了斜槓"/"外的全部字符做爲捕獲的值。
  3. url不須要以斜槓開頭。

代碼示例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

  • /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('image_codes/<uuid>', views.xxxx)  image_codes是前綴,<uuid>是django自帶的配合器寫法,獲得的是一個UUID對象, 在視圖方法中經過參數來接受這個 uuid    例如: def get(self,request,uuid) 能夠打印這個UUID 獲得是一個前端傳過來的uuid.

註冊自定義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.

相關文章
相關標籤/搜索