摘要:第二種方式叫做反向解析反向匹配反向查詢或者簡單的反查。一個(gè)命名空間有兩個(gè)部分,它們都是字符串應(yīng)用命名空間它表示正在部署的應(yīng)用的名稱。例如,可以預(yù)見的管理站點(diǎn)的應(yīng)用命名空間是。的命名空間使用操作符指定。
1.Django 如何處理一個(gè)請求
Django 決定要使用的根URLconf 模塊。通常,這個(gè)值就是ROOT_URLCONF 的設(shè)置,但是如果進(jìn)來的HttpRequest對象具有一個(gè)urlconf 屬性(通過中間件request processing 設(shè)置),則使用這個(gè)值來替換ROOT_URLCONF設(shè)置。
Django 加載該P(yáng)ython 模塊并尋找可用的urlpatterns。它是django.conf.urls.url()
實(shí)例的一個(gè)Python 列表。
Django 依次匹配每個(gè)URL 模式,在與請求的URL 匹配的第一個(gè)模式停下來。 一旦其中的一個(gè)正則表達(dá)式匹配上,Django將導(dǎo)入并調(diào)用給出的視圖,它是一個(gè)簡單的Python 函數(shù)(或者一個(gè)基于類的視圖)。視圖將獲得如下參數(shù): 一個(gè)HttpRequest 實(shí)例。
如果匹配的正則表達(dá)式返回了沒有命名的組,那么正則表達(dá)式匹配的內(nèi)容將作為位置參數(shù)提供給視圖。關(guān)鍵字參數(shù)由正則表達(dá)式匹配的命名組組成,但是可以被django.conf.urls.url()的可選參數(shù)kwargs覆蓋。
如果沒有匹配到正則表達(dá)式,或者如果過程中拋出一個(gè)異常,Django 將調(diào)用一個(gè)適當(dāng)?shù)腻e(cuò)誤處理視圖。
2.URL解釋:schema://host[:port#]/path/.../?query-string
schema:指定使用的協(xié)議(例如:http, https, ftp)
host:Http服務(wù)器的IP地址或者域名
port:端口號,默認(rèn)是80端口
path:訪問資源的路徑
query-string:發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor:錨點(diǎn)
3.URL中的正則url(r"^test1/9999/$", views.test1.as_view()), #普通用法 url(r"^test2/([0-9]{4})/$", views.test2.as_view()), # 單個(gè)非命名參數(shù) url(r"^test3/([0-9]{4})/([0-9]{2})/$", views.test3.as_view()), url(r"^test4/([0-9]{4})/([0-9]{2})/([0-9]+)/$", views.test4.as_view()),
我們先開始建一個(gè)django工程 在這里我們給給工程命名為lesson1 放在Django_lesson文件夾下
具體建django工程的細(xì)節(jié)詳情見Django-01、初識Django和搭建Django helloworld
然后新建一個(gè)app 名為urltest
在lesson1.url.py 中導(dǎo)入view
from urltest import views4.非命名參數(shù)
在lesson.urls.py中添加以下路由
url(r"^admin/", admin.site.urls), url(r"^test1/9999/$", views.Test1.as_view()), url(r"^test2/([0-9]{4})/$", views.Test2.as_view()), url(r"^test3/([0-9]{4})/([0-9]{2})/$", views.Test3.as_view()), views.Test4.as_view()),
在urltest.view.py中添加以下視圖類
class Test1(View): def get(self, request): msg = "Test1 sucessful" return HttpResponse(msg) class Test2(View): def get(self, request, year): msg = "Test2 sucessful %s 年" % year return HttpResponse(msg) class Test3(View): def get(self, request, year, month): msg = "Test3 sucessful %s 年 %s 月" % (year, month) return HttpResponse(msg)
注:
若要從URL 中捕獲一個(gè)值,只需要在它周圍放置一對圓括號。
不需要添加一個(gè)前導(dǎo)的反斜杠,因?yàn)槊總€(gè)URL 都有。例如,應(yīng)該是^articles 而不是 ^/articles。
每個(gè)正則表達(dá)式前面的"r" 是可選的但是建議加上。它告訴Python 這個(gè)字符串是“原始的” —— 字符串中任何字符都不應(yīng)該轉(zhuǎn)義。參見Dive Into Python 中的解釋。
^代表開始匹配,如果只有^符號,則只需要部分匹配成功即可
$代表結(jié)束匹配,添加$符號, 一般就代表完整匹配
我們的URL匹配規(guī)則一定需要保持唯一
5.命名參數(shù)上面的示例使用簡單的、沒有命名的正則表達(dá)式組(通過圓括號)來捕獲URL 中的值并以位置 參數(shù)傳遞給視圖。在更高級的用法中,可以使用命名的正則表達(dá)式組來捕獲URL 中的值并以關(guān)鍵字 參數(shù)傳遞給視圖。
在Python 正則表達(dá)式中,命名正則表達(dá)式組的語法是(?P
url(r"^test4/(?P[0-9]{4})/$", views.Test4.as_view()), url(r"^test5/(?P [0-9]{4})/(?P [0-9]{2})/$", views.Test5.as_view()),
在urltest.view.py中添加以下視圖類
class Test4(View): def get(self, request, year): msg = "Test3 sucessful %s 年" % year return HttpResponse(msg) class Test5(View): def get(self, request, month, year): # 這里我們交換了year和month的順序 msg = "Test3 sucessful %s 年 %s 月" % (year, month) return HttpResponse(msg)
如果有命名參數(shù),則使用這些命名參數(shù),忽略非命名參數(shù)。
否則,它將以位置參數(shù)傳遞所有的非命名參數(shù)。
請求的URL被看做是一個(gè)普通的Python 字符串, URLconf在其上查找并匹配。進(jìn)行匹配時(shí)將不包括GET或POST請求方式的參數(shù)以及域名。換句話講,所有的請求方法 —— 即,對同一個(gè)URL的無論是POST請求、GET請求、或HEAD請求方法等等 —— 都將路由到相同的函數(shù)。
每個(gè)捕獲的參數(shù)都作為一個(gè)普通的Python 字符串傳遞給視圖,無論正則表達(dá)式使用的是什么匹配方式。
在任何時(shí)候,你的urlpatterns 都可以包含其它URLconf 模塊。這實(shí)際上將一部分URL 放置于其它URL 下面。
在lesson1.urls.py中加入以下代碼
from django.conf.urls import include # 導(dǎo)入 include url(r"^test7/", include("urltest.urls")), # 加入路由
在urltest文件夾下新建urls.py加入以下代碼
from django.conf.urls import url from urltest import views urlpatterns = [ url(r"^test7/$", views.Test7.as_view()), ]
在urltest.views.py加入以下視圖類
class Test7(View): def get(self, request): # 這里我們交換了year和month的順序 msg = "Test7 sucessful" return HttpResponse(msg)傳遞額外的選項(xiàng)給視圖函數(shù)
URLconfs 具有一個(gè)鉤子,讓你傳遞一個(gè)Python 字典作為額外的參數(shù)傳遞給視圖函數(shù)。
django.conf.urls.url() 函數(shù)可以接收一個(gè)可選的第三個(gè)參數(shù),它是一個(gè)字典,表示想要傳遞給視圖函數(shù)的額外關(guān)鍵字參數(shù)。
#lesson1.urls.py中加入這個(gè)路由 url(r"^test8/", include("urltest.urls"), {"name": "lethe", "date": "2018"}), #urltest.urls.py中加入這個(gè)路由 url(r"^test8/$", views.Test8.as_view()), #views.py中加入這個(gè)視圖類 class Test8(View): def get(self, request, name, date): # 這里我們交換了year和month的順序 msg = "Test8 sucessful by %s in %s" % (name, date) return HttpResponse(msg)6.錯(cuò)誤處理
當(dāng)Django 找不到一個(gè)匹配請求的URL 的正則表達(dá)式時(shí),或者當(dāng)拋出一個(gè)異常時(shí),Django 將調(diào)用一個(gè)錯(cuò)誤處理視圖。
Http狀態(tài)碼
每一個(gè)請求,都會(huì)返回一個(gè)狀態(tài)
200 : 請求正常
404:找不到頁面
403:是指服務(wù)器拒絕
400:request異常
500:服務(wù)器異常
在URLconf中指定參數(shù),這些參數(shù)分別是
handler404
一個(gè)callable或一個(gè)字符串,表示如果沒有URL模式匹配,應(yīng)該調(diào)用的視圖的完整Python導(dǎo)入路徑。
默認(rèn)情況下是"django.views.defaults.page_not_found"。
handler500
一個(gè)callable或一個(gè)字符串,表示如果沒有URL模式匹配,應(yīng)該調(diào)用的視圖的完整Python導(dǎo)入路徑。
默認(rèn)情況下,這是"django.views.defaults.page_not_found"。
handler403
一個(gè)callable或一個(gè)字符串,表示如果用戶沒有訪問資源所需的權(quán)限,應(yīng)調(diào)用的視圖的完整Python導(dǎo)入路徑。
默認(rèn)情況下,這是"django.views.defaults.permission_denied"。
handler400
如果HTTP客戶端已發(fā)送導(dǎo)致錯(cuò)誤條件的請求和狀態(tài)代碼為400的響應(yīng),則應(yīng)調(diào)用的可調(diào)用或表示完整的Python視圖導(dǎo)入路徑的字符串。
默認(rèn)情況下,這是"django.views.defaults.bad_request"。
在settings.py中將DEBUG值改為True
當(dāng)找不到頁面的時(shí)候 頁面顯示如下圖
然后我們再在settings.py中將DEBUG值改為False (我們一般在開發(fā)的時(shí)候設(shè)置DEBUG值為True 在產(chǎn)品上線的時(shí)候?qū)EBUG值改為False)
當(dāng)找不到頁面的時(shí)候 頁面顯示如下圖
我們將代碼作如下更改
#在views.py中加入以下代碼 def Error404(request): return HttpResponse("哎呦 404 尷尬了!") #DEBUG值保持為False #在lesson1.py中加入 handler404 = "urltest.views.Error404"7.URL 的反向解析
在使用Django 項(xiàng)目時(shí),一個(gè)常見的需求是獲得URL 的最終形式,以用于嵌入到生成的內(nèi)容中(視圖中和顯示給用戶的URL等)或者用于處理服務(wù)器端的導(dǎo)航(重定向等)。
人們強(qiáng)烈希望不要硬編碼這些URL(費(fèi)力、不可擴(kuò)展且容易產(chǎn)生錯(cuò)誤)或者設(shè)計(jì)一種與URLconf 毫不相關(guān)的專門的URL 生成機(jī)制,因?yàn)檫@樣容易導(dǎo)致一定程度上產(chǎn)生過期的URL。
換句話講,需要的是一個(gè)DRY 機(jī)制。除了其它優(yōu)點(diǎn),它還允許設(shè)計(jì)的URL 可以自動(dòng)更新而不用遍歷項(xiàng)目的源代碼來搜索并替換過期的URL。
要獲取一個(gè)URL,最初擁有的信息是負(fù)責(zé)處理它的視圖的標(biāo)識(例如名字),與查找正確的URL 的其它必要的信息如視圖參數(shù)的類型(位置參數(shù)、關(guān)鍵字參數(shù))和值。
Django 提供了一個(gè)解決方案使得URL 映射是URL 設(shè)計(jì)唯一的儲(chǔ)存庫。你用你的URLconf填充它,然后可以雙向使用它:
根據(jù)用戶/瀏覽器發(fā)起的URL 請求,它調(diào)用正確的Django 視圖,并從URL 中提取它的參數(shù)需要的值。
根據(jù)Django 視圖的標(biāo)識和將要傳遞給它的參數(shù)的值,獲取與之關(guān)聯(lián)的URL。
第一種方式是我們在前面的章節(jié)中一直討論的用法。第二種方式叫做反向解析URL、反向URL匹配、反向URL查詢或者簡單的URL反查。
在需要URL 的地方,對于不同層級,Django 提供不同的工具用于URL 反查:
在模板中:使用url 模板標(biāo)簽。
在Python 代碼中:使用django.core.urlresolvers.reverse() 函數(shù)。
在更高層的與處理Django 模型實(shí)例相關(guān)的代碼中:使用get_absolute_url() 方法。
#在urls.views.py中加入以下代碼 url(r"^articles/$", views.Articles.as_view()), #在views.py中加入以下代碼 class Articles(View): def get(self, request): return redirect("/test1/9999/")7.URL 命名空間
URL 命名空間允許你反查到唯一的命名URL 模式,即使不同的應(yīng)用使用相同的URL 名稱。第三方應(yīng)用始終使用帶命名空間的URL 是一個(gè)很好的實(shí)踐(我們在教程中也是這么做的)。類似地,它還允許你在一個(gè)應(yīng)用有多個(gè)實(shí)例部署的情況下反查URL。換句話講,因?yàn)橐粋€(gè)應(yīng)用的多個(gè)實(shí)例共享相同的命名URL,命名空間提供了一種區(qū)分這些命名URL 的方法。
一個(gè)URL命名空間有兩個(gè)部分,它們都是字符串:
應(yīng)用命名空間
它表示正在部署的應(yīng)用的名稱。一個(gè)應(yīng)用的每個(gè)實(shí)例具有相同的應(yīng)用命名空間。例如,可以預(yù)見Django 的管理站點(diǎn)的應(yīng)用命名空間是"admin"。
實(shí)例命名空間
它表示應(yīng)用的一個(gè)特定的實(shí)例。實(shí)例的命名空間在你的全部項(xiàng)目中應(yīng)該是唯一的。但是,一個(gè)實(shí)例的命名空間可以和應(yīng)用的命名空間相同。它用于表示一個(gè)應(yīng)用的默認(rèn)實(shí)例。
URL 的命名空間使用":" 操作符指定。例如,管理站點(diǎn)應(yīng)用的主頁使用"admin:index"。它表示"admin" 的一個(gè)命名空間和"index" 的一個(gè)命名URL。
命名空間也可以嵌套。命名URL"sports:polls:index" 將在命名空間"polls"中查找"index",而poll 定義在頂層的命名空間"sports" 中。
#在lesson1.urls.py中加入以下路由 url(r"^url1test/", include("urltest.urls_1", namespace="url1test")), url(r"^url2test/", include("urltest.urls", namespace="url2test")), url(r"^url1_login/$", views.ToUrl1Login.as_view()), url(r"^url2_login/$", views.ToUrl2Login.as_view()), #在urltest文件夾下新建url_1.py并加入以下代碼 from django.conf.urls import url from urltest import views urlpatterns = [ url(r"^login/$", views.Url1Login.as_view(), name="login"), ] #在urltest.url.py中加入以下路由 url(r"^login/$", views.Url2Login.as_view(), name="login"), # 在views.py中加入以下視圖類 class Url1Login(View): def get(self, request): return HttpResponse("我是url1test.login") class Url2Login(View): def get(self, request): return HttpResponse("我是url2test.login") class ToUrl1Login(View): def get(self, request): return redirect(reverse("url1test:login")) class ToUrl2Login(View): def get(self, request): return redirect(reverse("url2test:login"))
當(dāng)輸入/url1_login/時(shí) 跳到ToUrl1Login然后跳到url1test:login(即namespace="url1test",name="login"的路由 即/url1test/login/ 打印我是url1test.login)
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render from django.views import View from django.http import HttpResponse from django.shortcuts import reverse, redirect # Create your views here. class Test1(View): def get(self, request): msg = "Test1 sucessful" return HttpResponse(msg) class Test2(View): def get(self, request, year): msg = "Test2 sucessful %s 年" % year return HttpResponse(msg) class Test3(View): def get(self, request, year, month): msg = "Test3 sucessful %s 年 %s 月" % (year, month) return HttpResponse(msg) class Test4(View): def get(self, request, year): msg = "Test4 sucessful %s 年" % year return HttpResponse(msg) class Test5(View): def get(self, request, month, year): # 這里我們交換了year和month的順序 msg = "Test5 sucessful %s 年 %s 月" % (year, month) return HttpResponse(msg) class Test6(View): def get(self, request, num="1"): # 這里我們交換了year和month的順序 msg = "Test6 sucessful num=%s" % num return HttpResponse(msg) class Test7(View): def get(self, request): # 這里我們交換了year和month的順序 msg = "Test7 sucessful" return HttpResponse(msg) class Test8(View): def get(self, request, name, date): # 這里我們交換了year和month的順序 msg = "Test8 sucessful by %s in %s" % (name, date) return HttpResponse(msg) class Articles(View): def get(self, request): return redirect("/test1/9999/") class Reverse_test(View): def get(self, request): return redirect(reverse("reverse_test", args=("2021",))) class Url1Login(View): def get(self, request): return HttpResponse("我是url1test.login") class Url2Login(View): def get(self, request): return HttpResponse("我是url2test.login") class ToUrl1Login(View): def get(self, request): return redirect(reverse("url1test:login")) class ToUrl2Login(View): def get(self, request): return redirect(reverse("url2test:login")) def Error404(request): return HttpResponse("哎呦 404 尷尬了!")lesson1.urls.py
from django.conf.urls import url, include from django.contrib import admin from urltest import views urlpatterns = [ url(r"^admin/", admin.site.urls), url(r"^test1/9999/$", views.Test1.as_view()), url(r"^test2/([0-9]{4})/$", views.Test2.as_view(), name="reverse_test"), url(r"^test3/([0-9]{4})/([0-9]{2})/$", views.Test3.as_view()), url(r"^test4/(?Purltest.urls.py[0-9]{4})/$", views.Test4.as_view()), url(r"^test5/(?P [0-9]{4})/(?P [0-9]{2})/$", views.Test5.as_view()), url(r"^test6/(?P [0-9]+)/$", views.Test6.as_view()), url(r"^test7/", include("urltest.urls")), url(r"^test8/", include("urltest.urls"), {"name": "lethe", "date": "2018"}), url(r"^articles/$", views.Articles.as_view()), url(r"^reverse/$", views.Reverse_test.as_view()), url(r"^url1test/", include("urltest.urls_1", namespace="url1test")), url(r"^url2test/", include("urltest.urls", namespace="url2test")), url(r"^url1_login/$", views.ToUrl1Login.as_view()), url(r"^url2_login/$", views.ToUrl2Login.as_view()), ] handler404 = "urltest.views.Error404"
from django.conf.urls import url from urltest import views urlpatterns = [ url(r"^test7/$", views.Test7.as_view()), url(r"^test8/$", views.Test8.as_view()), url(r"^login/$", views.Url2Login.as_view(), name="login"), ]urls_1.py
from django.conf.urls import url from urltest import views urlpatterns = [ url(r"^login/$", views.Url1Login.as_view(), name="login"), ]目錄結(jié)構(gòu)
注: 本文章是本人的CSDN博客中對應(yīng)的文章轉(zhuǎn)過來的
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41462.html
摘要:此協(xié)議規(guī)范由和在年共同提出,并得到,蓮花,康柏等公司的支持,于年提交給萬維網(wǎng)聯(lián)盟?,F(xiàn)在,協(xié)議規(guī)范由萬維網(wǎng)聯(lián)盟的工作組維護(hù)。然而,在上使用并不僅限于協(xié)議綁定。元素用于在消息中傳輸錯(cuò)誤及狀態(tài)信息。 簡介 SOAP(Simple Object Access Protoco)簡單對象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息的簡單的協(xié)議,是一個(gè)基于 XML 的協(xié)議。此協(xié)議規(guī)范由 IBM、Micr...
摘要:在基于使用命名空間的文檔求值時(shí),需要使用對象。第四個(gè)參數(shù)的取值類型是下列常量之一,返回與表達(dá)式匹配的數(shù)據(jù)類型。,返回字符串值。這是最常用的結(jié)果類型。集合中節(jié)點(diǎn)的次序與它們在文檔中的次序一致。 JavaScript與XML 瀏覽器對XML DOM的支持 DOM2級核心 在通過JavaScript處理XML時(shí),通常只使用參數(shù)root,因?yàn)檫@個(gè)參數(shù)指定的是XML DOM文檔元素的標(biāo)簽名 v...
摘要:常出現(xiàn)的錯(cuò)誤前十位為了可讀性,錯(cuò)誤名稱進(jìn)行了一定的簡寫。讓我們深入了解每個(gè)錯(cuò)誤發(fā)生的原因以及解決方法。這個(gè)問題很容易解決。當(dāng)未捕獲的錯(cuò)誤跨越違法跨域策略的域邊界時(shí),會(huì)發(fā)生腳本錯(cuò)誤。這是當(dāng)你在中試圖調(diào)用的方法時(shí)出現(xiàn)的錯(cuò)誤。 JavaScript常出現(xiàn)的錯(cuò)誤前十位 showImg(https://segmentfault.com/img/bV3Z1z?w=1116&h=691); 為了可讀...
摘要:但實(shí)際上在命名空間這里卻不一樣,不同類文件中的命名空間之間是相互分離的,即某個(gè)文件中定義的的命名空間,在其他的類文件中不能使用。解決在中添加依賴類庫的命名空間別名以上就是今天遇到的關(guān)于命名空間的一個(gè)坑,謹(jǐn)記于此。 (沒想好title,見諒) 導(dǎo)讀 PHP的類文件在被其他文件include的時(shí)候不能直接使用其他文件中的已定義的別名。比如有三個(gè)文件。 test.php 一個(gè)簡單的腳...
閱讀 3609·2021-11-23 09:51
閱讀 2813·2021-11-23 09:51
閱讀 693·2021-10-11 10:59
閱讀 1693·2021-09-08 10:43
閱讀 3244·2021-09-08 09:36
閱讀 3306·2021-09-03 10:30
閱讀 3309·2021-08-21 14:08
閱讀 2214·2021-08-05 09:59