91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在django2中實現路由path語法

發布時間:2021-06-04 17:48:23 來源:億速云 閱讀:140 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關如何在django2中實現路由path語法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

第一個特性,主要用于動態路由定義上。在Django2.0代碼實現中,主要的變化是新增了 django.urls.path 函數,它允許使用一種更加簡潔、可讀的路由語法。比如之前的版本的代碼:

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

在新版本中也可以寫為:

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

新語法支持類型轉化,在上述的例子中, year_archive 函數接收到的year參數就變成整數而不是字符串。

如果你有接觸過 Flask 框架,就會發現和 Variable-Rules 的語法形式和功能都是相類似的。

一 問題引入

下面是 Django1.X 的一段代碼:

 from django.conf.urls import url

def year_archive(request, year):
  year = int(year) # convert str to int
  # Get articles from database

def detail_view(request, article_id):
  pass

def edit_view(request, article_id):
  pass

def delete_view(request, article_id):
  pass

urlpatterns = [
  url('articles/(?P<year>[0-9]{4})/', year_archive),
  url('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view),
  url('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view),
  url('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', delete_view),
]

考慮下這樣的兩個問題:

第一個問題,函數 year_archive 中year參數是字符串類型的,因此需要先轉化為整數類型的變量值,當然 year=int(year) 不會有諸如如TypeError或者ValueError的異常。那么有沒有一種方法,在url中,使得這一轉化步驟可以由Django自動完成?

第二個問題,三個路由中 article_id 在業務中表示同一個字段,使用同樣的正則表達式,但是你需要寫三遍,當之后 article_id 規則改變后,需要同時修改三處代碼,那么有沒有一種方法,只需修改一處即可?

在 Django2.0 中,可以使用 path 解決以上的兩個問題。

二 使用示例

這是一個簡單的例子:

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

基本規則:

  • 使用尖括號(<>)從url中捕獲值。

  • 捕獲值中可以包含一個轉化器類型(converter type),比如使用 <int:name> 捕獲一個整數變量。若果沒有轉化器,將匹配任何字符串,當然也包括了 / 字符。

  • 無需添加前導斜杠。

以下是根據 2.0官方文檔 而整理的示例分析表:

請求URL匹配項視圖函數調用形式
/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轉化器

文檔原文是Path converters,暫且翻譯為轉化器。

Django默認支持以下5個轉化器:

  • str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式

  • int,匹配正整數,包含0。

  • slug,匹配字母、數字以及橫杠、下劃線組成的字符串。

  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

  • path,匹配任何非空字符串,包含了路徑分隔符

四 自定義轉化器

4.1 定義

對于一些復雜或者復用的需要,可以定義自己的轉化器。轉化器是一個類或接口,它的要求有三點:

  • regex 類屬性,字符串類型

  • to_python(self, value) 方法,value是由類屬性 regex 所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對應的視圖函數中。

  • to_url(self, value) 方法,和 to_python 相反,value是一個具體的Python變量值,返回其字符串,通常用于url反向引用。

先看看默認的 IntConverter 和 StringConverter 是怎么實現的:

 class IntConverter:
  regex = '[0-9]+'

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

  def to_url(self, value):
    return str(value)


class StringConverter:
  regex = '[^/]+'

  def to_python(self, value):
    return value

  def to_url(self, value):
    return value

第二個例子,是自己實現的4位年份的轉化器。

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

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

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

4.2 注冊

使用register_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),
  ...
]

五 使用正則表達式

如果上述的paths和converters還是無法滿足需求,也可以使用正則表達式,這時應當使用 django.urls.re_path函數。

在Python正則表達式中,命名式分組語法為 (?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>[^/]+)/', views.article_detail),
]

這段代碼和之前的代碼實現了基本的功能,但是還是有一些區別:

  • 這里的代碼匹配更加嚴格,比如year=10000在這里就無法匹配。

  • 傳遞給視圖函數的變量都是字符串類型,這點和 url 是一致的。

無命名分組

一般來說,不建議使用這種方式,因為有可能引入歧義,甚至錯誤。

六 Import變動

django.urls.path 可以看成是 django.conf.urls.url 的增強形式。

為了方便,其引用路徑也有所變化,請注意下 urls 包路徑的變更,不再是 conf 的子包了,目前和 views 、conf 一樣,被認為是 Django 的核心組件。

1.X2.0備注
-django.urls.path新增,url的增強版
django.conf.urls.includedjango.urls.include路徑變更
django.conf.urls.urldjango.urls.re_path異名同功能,url不會立即廢棄

七 代碼改寫

將“問題引入”一節的代碼使用新的path函數可以改寫如下:

 from django.urls import path, register_converter
from django.urls.converters import SlugConverter

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

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

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

register_converter(SlugConverter, 'article_id')
register_converter(FourDigitYearConverter, 'year')

def year_archive(request, year):
  print(type(year)) # <class 'int'>
  # Get articles from database

def detail_view(request, article_id):
  pass

def edit_view(request, article_id):
  pass

def delete_view(request, article_id):
  pass

urlpatterns = [
  path('articles/<year:year>/', year_archive),
  path('article/<article_id:article_id>/detail/', detail_view),
  path('articles/<article_id:article_id>/edit/', edit_view),
  path('articles/<article_id:article_id>/delete/', delete_view),
]

看完上述內容,你們對如何在django2中實現路由path語法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汤原县| 巴林右旗| 公安县| 罗城| 屯门区| 璧山县| 施甸县| 宣城市| 彩票| 吉安市| 白沙| 玉环县| 砚山县| 河曲县| 罗江县| 昭苏县| 敖汉旗| 舞阳县| 平江县| 扎囊县| 甘德县| 银川市| 当雄县| 南京市| 讷河市| 双辽市| 长岭县| 灌南县| 偏关县| 泽普县| 海原县| 安丘市| 梓潼县| 凉山| 太和县| 五台县| 大兴区| 嘉鱼县| 佳木斯市| 元谋县| 东乌珠穆沁旗|