日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django2.+ path配置

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django2.+ path配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2017年12月2號,Django2.0發布!!!所以之前1.8版本的已經有所改變。

其中url變成path。

?

9月23日Django發布了2.0a1版本,這是一個 feature freeze 版本,如果沒有什么意外的話,2.0正式版不會再增加新的功能了。按照以往的規律,預計正式版將在12月發布。

2.0無疑是一個里程碑版本,因為這是第一個只支持Python3.X的版本,和1.x是不兼容的。

What’s new in Django2.0?文檔中一共列出了三個新的特性:

  • 更簡單的URL路由語法 (Simplified URL routing syntax)
  • admin應用的針對移動設備的優化改進(Mobile-friendly?contrib.admin)
  • 支持SQL開窗表達式(Window expressions)

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

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


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

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

    問題引入

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

    [python]?view plaincopy
  • 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?解決以上的兩個問題。

    基本示例

    這是一個簡單的例子:

    [python]?view plaincopy
  • 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,匹配任何非空字符串,包含了路徑分隔符

    注冊自定義轉化器

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

    • regex?類屬性,字符串類型

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

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

    例子:

    [python]?view plaincopy
  • class?FourDigitYearConverter:????
  • ????regex?=?'[0-9]{4}'????
  • ????def?to_python(self,?value):????
  • ????????return?int(value)????
  • ????def?to_url(self,?value):????
  • ????????return?'%04d'?%?value????
  • 使用register_converter?將其注冊到URL配置中:

    [python]?view plaincopy
  • 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為待匹配的模式。

    之前的示例代碼也可以寫為:

    [python]?view plaincopy
  • 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?的增強形式。

    為了方便,其引用路徑也有所變化。

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

    總結

    新的path語法可以解決一下以下幾個場景:

    • 類型自動轉化
    • 公用正則表達式

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

    [python]?view plaincopy
  • from?django.urls?import?path,?register_converter????
  • class?ArticleIdConverter:????
  • ????regex?=?'[a-zA-Z0-9]+'????
  • ????def?to_python(self,?value):????
  • ????????return?value????
  • ????def?to_url(self,?value):????
  • ????????return?value????
  • register_converter(ArticleIdConverter,?'article_id')????
  • 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/<article_id:article_id>/detail/',?detail_view),????
  • ????url('articles/<article_id:article_id>/edit/',?edit_view),????
  • ????url('articles/<article_id:article_id>/delete/',?delete_view),????
  • ]????
  • 從流程來看,包含了四個步驟:匹配 => 捕獲 => 轉化 => 視圖調用,和之前相比多了轉化這一步。

    轉載于:https://www.cnblogs.com/trunkslisa/p/9482254.html

    總結

    以上是生活随笔為你收集整理的Django2.+ path配置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。