Django的路由系統:URL

来源:https://www.cnblogs.com/zengyi1995/archive/2019/07/05/11140527.html
-Advertisement-
Play Games

一、 URLconf配置 1. 基本格式 參數說明 正則表達式:一個正則表達式字元串 views視圖:一個可調用對象,通常為一個視圖函數 參數:可選的要傳遞給視圖函數的預設參數(字典形式) 別名:一個可選的name參數 2. django 2.0版本的路由系統 2.0版本中re_path和1.11版 ...


一、 URLconf配置

  1. 基本格式

    from django.conf.urls import url
    urlpatterns = [
         url(正則表達式, views視圖,參數,別名),
    ]
    • 參數說明
      • 正則表達式:一個正則表達式字元串
      • views視圖:一個可調用對象,通常為一個視圖函數
      • 參數:可選的要傳遞給視圖函數的預設參數(字典形式)
      • 別名:一個可選的name參數
  2. django 2.0版本的路由系統

    • 2.0版本中re_path和1.11版本的url是一樣的用法
    from django.urls import path,re_path
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
    ]

二、 正則表達式

  1. 基本配置

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
    ]
  2. 註意事項

    • urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則不再繼續
    • 若要從URL中捕獲一個值,只需要在它周圍放置一對圓括弧(利用分組匹配)
    • 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles
    • 每個正則表達式前面的'r' 是可選的但是建議加上
  3. 補充說明

    • 是否開啟URL訪問地址後面不為/跳轉至帶有/的路徑的配置項:APPEND_SLASH=True
    • Django settings.py配置文件中預設沒有 APPEND_SLASH 這個參數,但 Django 預設這個參數為 APPEND_SLASH = True,其作用就是自動在網址結尾加'/'

三、 分組命名匹配

  1. 分組:使用簡單的正則表達式分組匹配(通過圓括弧)來捕獲URL中的值並以位置參數形式傳遞給視圖函數

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    ]
  2. 命名分組:使用分組命名匹配的正則表達式組來捕獲URL中的值並以關鍵字參數形式傳遞給視圖函數

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    ]
    • 補充:url的第三個參數時一個字典,表示想要傳遞給視圖函數的額外關鍵字參數
      • 當傳遞額外參數的字典中的參數和URL中捕獲值的命名關鍵字參數同名時,函數調用時,將使用的是字典中的參數,而不是URL中捕獲的參數
      • 即優先順序:額外參數 > URL捕獲參數
  3. UPLconf匹配的位置:

    • URLconf 在請求的URL 上查找,將它當做一個普通的Python字元串,不包括GET和POST參數以及功能變數名稱
      • http://www.example.com/myapp/請求中,URLconf 將查找 /myapp/
      • http://www.example.com/myapp/?page=3請求中,URLconf 仍將查找 /myapp/
    • URLconf 不檢查請求的方法,即所有的請求方法(同一個URL的POST、GET、HEAD等),都將路由到相同的函數
  4. 捕獲的參數都是字元串:每個在URLconf中捕獲的參數都作為一個普通的Python字元串傳遞給視圖函數,無論正則表達式使用的是什麼匹配方式

  5. 有個別情況,需要視圖函數指定預設值

    # urls.py中
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^blog/$', views.page),
        url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
    ]
    # 兩個URL模式指向相同的view,但是第一個模式並沒有從URL中捕獲任何東西
    
    # views.py中,可以為num指定預設值
    def page(request, num="1"):
        pass
    # 如果第一個模式匹配上了,page函數將使用其預設參數num=“1”,如果第二個模式匹配,page將使用正則表達式捕獲到的num值
  6. include:路由分發

    • 根據功能或種類的不同,可以把不同的功能的路由寫在該功能的app文件下,利用include聯繫起來,相當於把不同功能的url放在不同的空間里
    from django.conf.urls import include, url
    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^app01/', include('app01.urls')),  # 可以包含其他的URLconfs文件
    ]
    • 補充:app01.urls
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^blog/$', views.blog),
        url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blogs),
    ]
    • include有一個命名空間的參數:namespace
      • 便於區分不同路由空間中存在的同名函數,利於指定到確切的函數
    from django.conf.urls import include, url
    urlpatterns = [
        url(r'^app01/', include('app01.urls', namespace='app01')),
        url(r'^app02/', include('app02.urls', namespace='app02')),
    ]

四、URL的命名和反向解析

4.1 URL命名

  1. url的第四個參數是起一個別名,即一個可選的name參數

  2. 命名方式:name = '別名'

    from django.conf.urls import url
    urlpatterns = [
     url(r'^home', views.home, name='home'),        # 給我的url匹配模式起名為 home
     url(r'^index/(\d*)', views.index, name='index'),       # 給我的url匹配模式起名為index
    ]

4.2 反向解析

  1. 反向解析:通過別名獲取完整URL路徑

  2. 情況一:靜態路由

    • 命名
    from django.conf.urls import url
    urlpatterns = [
     url(r'^blog/$', views.blog, name='blog'),
    ]
    • 模板中使用
    {% url 'blog' %}         {# 完整URL路徑:/blog/ #}
    • py文件中使用
    from django.urls import reverse
    reverse('blog')           # 完整URL路徑:/blog/
  3. 情況二:分組

    • 命名
    from django.conf.urls import url
    urlpatterns = [
     url(r'^blog/([0-9]{4})/(\d{2})/$', views.blogs, name='blogs'),
    ]
    • 模板中使用
    {% url 'blogs' 2222 12 %}        {# 完整URL路徑:/blog/2222/12/ #}
    • py文件中使用
    from django.urls import reverse
    reverse('blogs',args=('2019','06'))        # 完整URL路徑:/blog/2019/06/ 
  4. 情況三:命名分組

    • 命名
    from django.conf.urls import url
    urlpatterns = [
     url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})$', views.blogs, name='blogs'),
    ]
    • 模板中使用
    {% url 'blogs' year=2222 month=12 %}      {# 完整URL路徑:/blog/2222/12/ #}
    • py文件中使用
    from django.urls import reverse
    reverse('blogs',kwargs={'year':'2019','month':'06'})      # 完整URL路徑:/blog/2019/06/ 

五、 命名空間模式下的反向解析

  1. 項目目錄下的urls.py

    from django.conf.urls import url, include
    urlpatterns = [
        url(r'^app01/', include('app01.urls', namespace='app01')),
        url(r'^app02/', include('app02.urls', namespace='app02')),
    ]
  2. app01中的urls.py

    from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
    ]
  3. app02中的urls.py

    from django.conf.urls import url
    from app02 import views
    urlpatterns = [
        url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
    ]
  4. 反向解析語法:'命名空間名稱:URL名稱'

    • 在模板中的使用方式
    {% url 'app01:detail' pk=12 %}
    {% url 'app02:detail' pk=12 %}
    • 在py文件中的使用方式
    from django.urls import reverse
    reverse('app01:detail', kwargs={'pk':11})
    reverse('app01:detail', kwargs={'pk':11})
  5. 註意:如果有多層路由分發,有了多個命名空間名稱,都要把命名空間名稱一層一層加在別名前面

    {# 簡單示例:app01是第一層路由空間的namespace,xxx是第二層路由空間的namespace #}
    {% url 'app01:xxx:index' %}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. 安全性問題 線程安全的本質是正確性,而正確性的含義是程式按照預期執行 理論上線程安全的程式,應該要避免出現可見性問題(CPU緩存)、原子性問題(線程切換)和有序性問題(編譯優化) 需要分析是否存線上程安全問題的場景:存在共用數據且數據會發生變化,即有多個線程會同時讀寫同一個數據 針對該理論的解 ...
  • this 註意 public class ThisDemo { public static void main(String[] args) { } } class Person{ public String name; public int age; public boolean gender; ...
  • 1.TP框架基礎 1.1目錄結構 1.2配置文件 1.框架主配置文件(慣例配置文件) thinkphp/convention.php 2. 應用公共配置文件 application/config.php, application/database.php 對整個應用生效 3.模塊配置文件 appli ...
  • 一、數字 整數 Python可以處理任意大小的整數,當然包括負整數,在程式中的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。 電腦由於使用二進位,所以,有時候用十六進位表示整數比較方便,十六進位用0x首碼和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等 ...
  • 7.6 多態性 1 什麼是多態性 多態指的是同一種事物多種形態,在程式中用繼承可以表現出多態。多態性:可以在不用考慮對象具體類型的前提下而直接使用對象下的方法 2、為什要用多態 用基類創建一套統一的規則,強制子類去遵循(使用抽象類實現),可以在不考慮對象具體的類的情況下直接參考基類的標準使用對象 7 ...
  • 一、二叉樹回憶 上一篇我們對數據結構中常用的樹做了介紹,本篇博客主要以二叉樹為例,講解一下樹的數據結構和代碼實現。回顧二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree) 二、二叉樹比鏈表好在哪裡? 看看如下的 ...
  • 在編寫代碼時,我們應該有一些方法將程式像連接水管一樣連接起來 當我們需要獲取一些數據時,可以去通過"擰"其他的部分來達到目的。這也應該是IO應有的方式。 Doug McIlroy. October 11, 1964 為什麼應該使用stream? 在node中,I/O都是非同步的,所以在和硬碟以及網路的 ...
  • 數組去重 查找元素 數組降序 迭代數組 將map轉為數組 合併數組 合併map 判斷map中key是否存在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...