Django之URLconf路由

URLconf路由

一個干凈優雅的URL方案是高質量Web應用程序中的一個重要細節。

Django可以讓你設計URL,無論你想要什么,沒有框架限制。

要為應用程序設計URL,您可以非正式地創建一個名為URLconf(URL配置)的Python模塊。

這個模塊是純Python代碼,是一個簡單的Python模式(簡單的正則表達式)到Python函數(您的視圖)之間的映射。

1. Django是如何處理一個請求:

當用戶從Django供電的站點請求頁面時,系統遵循以下算法來確定要執行的Python代碼:

  1. 首先Django確定要使用的根URLconf模塊,通過ROOT_URLCONF來設置,具體在settings.py配置文件中。但是如果傳入 HttpRequest對象具有urlconf 屬性(由中間件設置),則其值將用于替換ROOT_URLCONF設置。
  2. Django加載該Python模塊并查找該變量 urlpatterns。這應該是一個Python的django.conf.urls.url()實例列表。
  3. Django按順序運行每個URL模式,并在匹配所請求的URL的第一個URL中停止。
  4. 一旦正則表達式匹配,Django將導入并調用給定的視圖,這是一個簡單的Python函數(或基于類的視圖)。
  5. 如果沒有正則表達式匹配,或者在此過程中的任何一點出現異常,Django將調用適當的錯誤處理視圖。

示例

以下是一個URLconf示例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^articles/2003/$', views.special_case_2003),url(r'^articles/([0-9]{4})/$', views.year_archive),url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

說明:

  • 要從URL捕獲一個值,只需將其括起來。
  • 沒有必要添加一個主要的斜杠,因為每個URL都有。例如^articles,不是^/articles。
  • 正則中的’r’正面的每個正則表達式字符串的中是可選的,但推薦使用。它告訴Python一個字符串是“raw” - 字符串中沒有任何內容應該被轉義。請參閱Dive Into Python的解釋。

示例請求:

  • /articles/2005/03/將匹配列表中的第三個條目。Django會調用該函數 。views.month_archive(request, ‘2005’, ‘03’)
  • /articles/2005/3/ 不符合任何網址格式,因為列表中的第三個條目需要兩個數字的月份。
  • /articles/2003/將匹配列表中的第一個模式,而不是第二個模式,因為模式是按順序測試的,第一個模式是第一個測試通過。隨意利用這些命令插入特殊情況。在這里,Django會調用該函數 views.special_case_2003(request)
  • /articles/2003 將不匹配任何這些模式,因為每個模式要求URL以斜杠結尾。
  • /articles/2003/03/03/將匹配最終模式。Django會調用該函數。views.article_detail(request, ‘2003’, ‘03’, ‘03’)

注意:每個捕獲的參數都作為純Python字符串發送到視圖,無論正則表達式的匹配是什么,即使[0-9]{4}只會匹配整數字符串。

2. 命名組

  • 上述使用為簡單實例,屬于正則表達式非命名組(通過括號)捕獲URL定位,并將它們作為位置參數傳遞給視圖。

  • 在更高級的使用中,我們可以使用正則表達式命名組來捕獲URL定位,并將它們作為關鍵字 參數傳遞給視圖。

  • 在Python正則表達式中,正則表達式命名組的語法是(?P<name>pattern),其中命名組中的命名就是name,并且 pattern是某些匹配的模式。

實例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^articles/2003/$', views.special_case_2003),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(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

這完成了與上一個例子完全相同的事情,有一個微妙的區別:捕獲的值被傳遞到視圖函數作為關鍵字參數,而不是位置參數。

例如:

  • 請求/articles/2005/03/調用函數 ,。views.month_archive(request, year=‘2005’, month=‘03’) 而不是 views.month_archive(request, ‘2005’, ‘03’)

  • 請求/articles/2003/03/03/調用函數 。views.article_detail(request, year=‘2003’, month=‘03’, day=‘03’)

  • 在實踐中,這意味著您的URLconfs稍微更明確,更不容易出現參數命令錯誤 - 您可以重新排序視圖的函數定義中的參數。當然,這些好處是以簡潔為代價的; 一些開發人員發現命名組語法丑陋而且太冗長。

URLconf的搜索

URLconf將根據所請求的URL進行搜索,作為普通的Python字符串。這不包括GET或POST參數或域名。

例如:

在請求中https://www.example.com/myapp/,URLconf將尋找myapp/。

在請求中https://www.example.com/myapp/?page=3,URLconf將會查找myapp/。

URLconf不查看請求方法。換句話說,所有的請求方法(GET,POST,HEAD等)都將被路由到相同的URL功能。

指定用于視圖參數的默認值

一個方便的技巧是為您的視圖參數指定默認參數。下面是一個URLconf和view的例子:

在下面的示例中,兩個URL模式指向相同的視圖views.page- 但是第一個模式不會從URL捕獲任何內容。

如果第一個模式匹配,該page()函數將使用它的默認參數num,“1”。

如果第二個模式匹配, page()將使用num正則表達式捕獲的任何值。

# URLconf
from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^blog/$', views.page),url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):# Output the appropriate page of blog entries, according to num....

3. 錯誤處理

當Django找不到與請求的URL匹配的正則表達式時,或者異常引發時,Django將調用錯誤處理視圖。

用于這些情況的視圖由四個變量指定。它們的默認值對于大多數項目都是足夠的,但通過覆蓋其默認值可以進一步定制。

有關詳細信息,請參閱自定義錯誤視圖的文檔。

這樣的值可以在你的根URLconf中設置。在任何其他URLconf中設置這些變量將不起作用。

值必須是可調用的,或者代表視圖的完整的Python導入路徑的字符串,應該被調用來處理手頭的錯誤條件。

變量是:

  • handler400- 見django.conf.urls.handler400。
  • handler403- 見django.conf.urls.handler403。
  • handler404- 見django.conf.urls.handler404。
  • handler500- 見django.conf.urls.handler500。

關于404錯誤

  • 404的錯誤頁面,在模板目錄中創建一個404.html的頁面,
  • 在配置文件中 settings.py DEBUG=False
  • 在出現404的情況時,自動尋找404頁面。
  • 也可以在視圖函數中 手動報出404錯誤,帶提醒信息
  • 在視圖函數中也可以指定返回一個404
注意 Http404需要在django.http的模塊中引入# 響應404raise Http404('納尼a')

在模板中 404.html

<!DOCTYPE html>
<html>
<head><title>404</title>
</head>
<body><center><h2>404 not found</h2><h3>{ {   exception   } }</h3></center>
</body>
</html>

4. 包括其他的URLconf

在任何時候,您urlpatterns都可以“包含”其他URLconf模塊。

這實質上是將一組網址“植根于”其他網址之下

例如,下面是Django網站本身的URLconf的摘錄。它包含許多其他URLconf:

from django.conf.urls import include, urlurlpatterns = [# ... snip ...url(r'^community/', include('django_website.aggregator.urls')),url(r'^contact/', include('django_website.contact.urls')),# ... snip ...
]

請注意,此示例中的正則表達式沒有$(字符串尾匹配字符),但包含尾部斜線。

每當Django遇到include()(django.conf.urls.include())時,它會截斷與該點匹配的URL的任何部分,并將剩余的字符串發送到包含的URLconf以供進一步處理。

5. URL的反向解析

如果在視圖、模板中使用硬編碼的鏈接,在urlconf發生改變時,維護是一件非常麻煩的事情

  • 解決:在做鏈接時,通過指向urlconf的名稱,動態生成鏈接地址
  • 視圖:使用django.core.urlresolvers.reverse()函數
  • 模板:使用url模板標簽

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中什么是關鍵字參數_如何使用python語言中函數的關鍵字參數的用法

一般情況下&#xff0c;在調用函數時&#xff0c;使用的是位置參數&#xff0c;即是按照參數的位置來傳值&#xff1b;關鍵字參數是按照定義函數傳入的參數名稱來傳值的。那么&#xff0c;關鍵字參數怎么使用&#xff1f;工具/原料 python pycharm 截圖工具 WPS 方法/步驟 1 打…

HTML塊級元素

在HTML5出現之前&#xff0c;人們一般把元素分為塊級、內聯和內聯塊元素。本文將詳細介紹HTML塊級元素h標題(Heading)元素有六個不同的級別&#xff0c;<h1>是最高級的&#xff0c;而<h6>則是最低的。一個標題元素能簡要描述該節的主題從<h1>到<h6>&am…

【SSL】HTTPS配置全過程

服務器配置https協議 HTTPS&#xff0c;是以安全為目標的HTTP通道&#xff0c;簡單講是HTTP的安全版。即HTTP下加入SSL層&#xff0c;HTTPS的安全基礎是SSL&#xff0c;因此加密的詳細內容就需要SSL。 配置HTTPS就需要證書&#xff0c;關于證書方面不做過多解釋&#xff0c;只…

iOS開發UI篇—懶載入

iOS開發UI篇—懶載入 1.懶載入基本 懶載入——也稱為延遲載入&#xff0c;即在須要的時候才載入&#xff08;效率低&#xff0c;占用內存小&#xff09;。所謂懶載入&#xff0c;寫的是其get方法. 注意&#xff1a;假設是懶載入的話則一定要注意先推斷是否已經有了。假設沒有那…

python之虛擬環境

Virtualenv(虛擬環境) VirtualEnv用于在一臺機器上創建多個獨立的Python虛擬運行環境&#xff0c;多個Python環境相互獨立&#xff0c;互不影響.這樣有很多優點,寶寶們要記住哦,比如: 在沒有權限的情況下安裝新套件 不同應用可以使用不同的套件版本 套件升級不影響其他應用 …

【解決】subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 127

pip list 報錯 Traceback (most recent call last):File "/home/sensetime/.pyenv/versions/3.6.5/bin/pip", line 11, in <module>sys.exit(main())File "/home/sensetime/.pyenv/versions/3.6.5/lib/python3.6/site-packages/pip/_internal/cli/main.p…

輸出四位完全平方數_完全平方數中的規律

PS&#xff1a;很近之前自己收集的資料一個正整數如果是另一個整數的完全平方&#xff0c;那么我們就稱這個數為完全平方數&#xff0c;也叫做平方數。如&#xff1a;0&#xff0c;1&#xff0c;4&#xff0c;9&#xff0c;16&#xff0c;25&#xff0c;36&#xff0c;49&#…

RTP格式圖 NNEXB格式和RTP格式

Dove(12337127) 10:15:45我看JM代碼里面有些疑問 看好多地方都出現了ANNEXB 時空互換(178316135) 10:16:08h264的2種碼流編碼格式Dove(12337127) 10:16:19我就不太理解是什么意思 剛才翻標準看見了 剛準備認真看看 Dove(12337127) 10:16:29annexb rtp 是么&#x…

第一階段沖刺第二天

昨天把以前寫過的Java普通用戶類和訂單類看了看&#xff0c;添加了一些變量 看了一些其他網頁的代碼 今天繼續寫關于收藏部分的代碼 遇到的困難&#xff1a;還是沒有什么頭緒&#xff0c;做不到真正的實現轉載于:https://www.cnblogs.com/lzxw/p/6800311.html

為企業提供本地銷售人員的Universal Avenue獲1000萬美元A輪融資

為各類B2B企業提供本地銷售人員的瑞典初創企業Universal Avenue近日獲得了1000萬美元的A輪融資。此輪融資由Eight Roads&#xff08;富達國際的投資機構&#xff09;領投&#xff0c;原有投資者Northzone和MOOR跟投&#xff0c;加上2015年獲得的500萬美元種子輪融資&#xff0c…

Python02期預科課程筆記索引

Python index day01 Python簡介 Python發展歷程 Python安裝以及版本檢測PyCharm的安裝和破解 day02 Python注釋及語句分類 Python命令方式和關鍵字Python中的變量Python的數據類型PyCharm中的快捷鍵 day03 Python數據類型轉換Python中的運算和運算符Python流程控制 day0…

【Linux分享】Linux常用命令+教程分享

今天分享分為兩部分 :) PART01 Linux常用命令分享/ PART02 關于BD面試經驗分享 30mins Linux Command: PART 1 你本可以張口就來..... 本篇內容分享的宗旨: 拿下Linux面試 別面試的時候呆呆地說個ls了&#x1f691; 本篇分享詳細地介紹了常用Linux指令的功能、語法、參…

萬能無線鼠標對碼軟件_400元就能買ROG無線游戲鼠標,ROG影刃2無線版使用體驗...

影刃2是ROG剛剛推出的一款新產品&#xff0c;定位入門游戲玩家。目前市面上定位入門游戲玩家的無線鼠標真不多&#xff0c;400塊以內的預算想要選購一款合適的無線游戲鼠標&#xff0c;選擇其實非常有限。 就ROG產品線而言&#xff0c;烈刃2的價格到了700塊錢&#xff1b;羅技G…

[轉帖]H.264 RTP payload 格式(有效載荷)

1. 網絡抽象層單元類型 (NALU)NALU 頭由一個字節組成, 它的語法如下:---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type |---------------F: 1 個比特.forbidden_zero_bit. 在 H.264 規范中規定了這一位必須為 0.NRI: 2 個比特.nal_ref_idc. 取 00 ~ 11, 似乎指示這個 NAL…

wampserver 虛擬主機

轉載&#xff1a;http://blog.csdn.net/knight_quan/article/details/51830683 1.背景&#xff1a; 在進行網站開發的時候&#xff0c;通常需要以http://localhost或者127.0.0.1等地址來訪問本地環境的網站。不過隨著開發項目的增多&#xff0c;需要每次先訪問localhost然后再選…

PL/SQL的結構

2019獨角獸企業重金招聘Python工程師標準>>> [DECLARE] --聲明開始關鍵字/*這里是聲明部分,包括PL/SQL中的變量、常量以及類型第等*/BEGIN --執行部分開始標志/*這里是執行部分,是整個PL/SQL塊的主體部分,該部分必須存在,可以是SQL語句或流程控制語句等…

cf方框透視易語言代碼怎么寫_易語言真的那么不入流嗎?

很多人鄙視易語言&#xff0c;為什么那么多人一提易語言&#xff0c;除了罵&#xff0c;還是罵&#xff0c;易語言很大錯誤嗎&#xff1f;知乎上的大神們是這么說的一個語言的“入流”&#xff0c;和是不是英文關鍵字無關&#xff0c;而是和這種語言進入某一子行業的契機有關。…

python發展歷程

作者&#xff1a;Vamei 出處&#xff1a;http://www.cnblogs.com/vamei 歡迎轉載&#xff0c;也請保留這段聲明。謝謝&#xff01; Python是我喜歡的語言&#xff0c;簡潔&#xff0c;優美&#xff0c;容易使用。前兩天&#xff0c;我很激昂的向朋友宣傳Python的好處。 聽過之…

【Django】RBAC權限管理系統模塊-理解

今天文章分為兩部分 :) PART1 RBAC權限管理內容分享/ PART2 關于字節跳動一面 10 Minutes Django-RBAC: PART 1 這權限管理系統主要功能是什么&#xff1f; 顧名思義&#xff0c;在系統中可以靈活的劃分角色組&#xff0c;可以根據功能特性來劃分&#xff1a;- 比如設置系…

NAL的基本特征

為了保證視頻流在不同傳輸環境中能有效地傳輸&#xff0c;單純的高壓縮率是不夠的&#xff0c;必須提供有效的方法&#xff0c;使視頻流能夠與傳輸協議無縫連接&#xff0c;才能應用到各種網絡。在以前的標準中&#xff0c;MPEG標準包含系統層&#xff0c;同時制定了H&#xff…