關于Django路由層簡單筆記

Django—路由層

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于客戶端發來的某個URL調用哪一段邏輯代碼對應執行。

1,簡單的路由配置

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

注意:若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。 每個正則表達式前面的'r' 是可選的但是建議加上。它告訴Python 這個字符串是“原始的” —— 字符串中任何字符都不應該轉義 示例

?

一些請求的例子:/articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數views.month_archive(request, '2005', '03')。
/articles/2005/3/ 不匹配任何URL 模式,因為列表中的第三個模式要求月份應該是兩個數字。
/articles/2003/ 將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。請像這樣自由插入一些特殊的情況來探測匹配的次序。
/articles/2003 不匹配任何一個模式,因為每個模式要求URL 以一個反斜線結尾。
/articles/2003/03/03/ 將匹配最后一個模式。Django 將調用函數views.article_detail(request, '2003', '03', '03')。

?

?

?

2,有名分組

上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值并以位置 參數傳遞給視圖。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值并以關鍵字 參數傳遞給視圖。 在Python 正則表達式中,命名正則表達式組的語法是(?Ppattern),其中name 是組的名稱,pattern 是要匹配的模式。 下面是以上URLconf 使用命名組的重寫:

from django.urls import path,re_pathfrom app01 import viewsurlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(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')。

?

?

3,路由分發

At any point, your urlpatterns can “include” other URLconf modules. This
essentially “roots” a set of URLs below other ones.
'''from django.urls import path,re_path,include
from app01 import viewsurlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^blog/', include('blog.urls')),
]

?

?

4,反向解析

?在使用Django 項目時,一個常見的需求是獲得URL 的最終形式,以用于嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用于處理服務器端的導航(重定向等)。人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。 在需要URL 的地方,對于不同層級,Django 提供不同的工具用于URL 反查:

在模板中:使用url標簽

在python腳本中:使用from django.urls import reverse()函數 urls.py:

from django.conf.urls import urlfrom . import viewsurlpatterns = [
#...
re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]

?在模板中:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a><ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

?

?在python中:

?

from django.urls import reverse
from django.http import HttpResponseRedirectdef redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) # 同redirect("/path/")

?

?當命名你的URL 模式時,請確保使用的名稱不會與其它應用中名稱沖突。如果你的URL 模式叫做comment,而另外一個應用中也有一個同樣的名稱,

當你在模板中使用這個名稱的時候不能保證將插入哪個URL。在URL 名稱中加上一個前綴,比如應用的名稱,將減少沖突的可能。我們建議使用myapp-comment 而不是comment。

?

?5,名稱空間

?命名空間(英語:Namespace)是表示標識符的可見范圍。一個標識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生沖突,因為已有的定義都處于其它命名空間中。 由于name沒有作用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定URL時,立即返回 我們在開發項目時,會經常使用name屬性反解出URL,當不小心在不同的app的urls中定義相同的name時,可能會導致URL反解錯誤,為了避免這種事情發生,引入了命名空間。

project的urls.py:

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^app01/', include("app01.urls",namespace="app01")),
re_path(r'^app02/', include("app02.urls",namespace="app02")),
]

?app01.urls:

urlpatterns = [
re_path(r'^index/', index,name="index"),
]?

?app01.views:

from django.core.urlresolvers import reverse
def index(request):
return HttpResponse(reverse("app01:index"))

?

?

?6,Django2.0中的path

思考:

urlpatterns = [
re_path('articles/(?P<year>[0-9]{4})/', year_archive),
re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view),
re_path('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),  
]

?

?

?基本規則:

  1. 使用尖括號(<>)從url中捕獲值。
  2. 捕獲值中可以包含一個轉化器類型(converter type),比如使用?捕獲一個整數變量。若果沒有轉化器,將匹配任何字符串,當然也包括了 / 字符。
  3. 無需添加前導的反斜杠

?

?

?path轉化器

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

  1. str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式
  2. int,匹配正整數,包含0。
  3. slug,匹配字母、數字以及橫杠、下劃線組成的字符串。
  4. uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  5. path,匹配任何非空字符串,包含了路徑分隔符

?

?

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

    1. regex 類屬性,字符串類型
    2. to_python(self, value) 方法,value是由類屬性 regex 所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對應的視圖函數中。
    3. to_url(self, value) 方法,和 to_python 相反,value是一個具體的Python變量值,返回其字符串,通常用于url反向引用。

?

?實例:

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配置中:

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

?

轉載于:https://www.cnblogs.com/xh-0205/p/9740782.html

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

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

相關文章

hdu 5183

hdu 5183(Hash處理區間問題) 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid5183 題意:給出一個n個元素的數組,現在要求判斷 a1-a2a3-a4...../-an 中是否存在某個某個區間使得 ai-ai1ai2...(-1)j-iaj k?? 這個題要利用Hash就可以實現幾乎在 O(n) 的時間內實現查找判斷…

vue-cli,webpack安裝

第一步應該下載node.js這是安裝vue-cli的基礎工具。官網下載快捷安全可&#xff1a;https://nodejs.org/en/ 第二步打開命令面板找到你要安裝的位置 第三步就是安裝全局vue-cli 命令操作 npm intatll -g vue-cli 安裝完畢之后 可以檢查安裝版本即 vue -V 如下圖 這還不算完&…

CSS3筆記之定位篇(二)z-index

知識點1&#xff1a;z-index基礎 z-index&#xff1a;auto; 默認值 z-index: <integer> 整數 z-index: inherit 繼承 不考慮css3 還有定位元素的z-index才有作用 知識點2&#xff1a;z-index與定位元素 無嵌套&#xff1a;后來居上&#xff0c;哪個大哪個上 //在沒有…

JSP頁面傳值出現中文亂碼的問題

在接收值的jsp頁面代碼的body里添加&#xff1a; <%request.setCharacterEncoding("utf-8"); %> //這里是設置utf-8為jsp頁面的中文編碼方式 jsp頁面之間傳值&#xff1a; 發送信息的jsp腳本&#xff1a; session.setAttribute("user",rs.getString…

【我所認知的BIOS】— uEFI AHCI Driver(8) — Pci.Read()

【我所認知的BIOS】—> uEFI AHCI Driver(8) — Pci.Read()LightSeed6/19/2014社會一直在變。不曉得是不是社會變的太苦開&#xff0c;而我沒變所以我反而顯得單純了。辦一個居住證。幾年前辦的以為最終能夠一勞永逸的&#xff0c;后來續辦的是發現確實不難了。尼瑪&#xf…

springboot項目集成vue

vue的項目目錄如下&#xff1a; vue項目打包 首先進入項目目錄&#xff1a;cd 項目名 然后執行打包命令&#xff1a;npm run build隨后我們的項目中會多出一個dist文件夾&#xff1a;如下圖 然后將dist文件夾中的所有內容放到eclipse中的src/main/resources/static文件夾里面…

Vue項目啟動webpack報錯Module build failed: Error: No PostCSS Config found in......

自己寫的公司項目&#xff0c;今天需要提交到公司版本庫&#xff0c;可是在本地啟動正常的項目&#xff0c;拷貝到git文件目錄下突然報錯Module build failed: Error: No PostCSS Config found in......&#xff0c;源文件都沒有改動過&#xff01; 然后自己各種百度&#xff…

2.1對 特征歸一化 的一些理解

特征歸一化有很多不同的叫法&#xff0c;比如&#xff1a;特征縮放&#xff0c;Feature Normalization&#xff0c;Feature Scaling 數據標準化&#xff08;歸一化&#xff09;處理是數據挖掘的一項基礎工作&#xff0c;不同評價指標往往具有不同的量綱和量綱單位&#xff0c;這…

逆向工程生成的Mapper.xml以及*Example.java詳解

逆向工程生成的接口中的方法詳解 在我上一篇的博客中講解了如何使用Mybayis逆向工程針對單表自動生成mapper.java、mapper.xml、實體類&#xff0c;今天我們先針對mapper.java接口中的部分方法進行測試&#xff0c;以了解其作用。 先看表結構。。。 從下圖可以看到MBG根據數據表…

SpringBoot之靜態資源訪問

SpringBoot之靜態資源訪問 1.springboot訪問靜態資源的幾種方式 (1)在src/main/resources/目錄下創建 static文件夾 (2)在src/main/resources/目錄下創建 resources文件夾 (3)在src/main/resources/目錄下創建 public文件夾 (4)在src/main/resources/目錄下創建 META-INF/resou…

幾何

題目大意定義一個$S-$四面體表示六條邊由$S$根不同的木棍組成&#xff0c;定義一種染色方法合法當且僅當至少有$S$根木棍被染色且與每個頂點相鄰的三根木棍中至多有一根被染色&#xff0c;求有$N$個$S1,2...N$四面體&#xff0c;求至少染$K$個的方案數。 題解 單獨考慮$S1$四面…

VUE的element-ui的使用

我們在自己的網站當中有的時候會用到element-ui的組建 1.如何安裝element-ui的組件 在命令行工具當中輸入cnpm i element-ui -S, 等待安裝 2.如何在vue當中使用element-ui的組件 1.在main.js中引入element相關的js和cssimport Vue from vueimport ElementUI from element-u…

NodeJS+Express+Mysql+MongoDB之環境配置

node作為一款可以兼容前后端的js語言,在做持久層操作上和Java比較類似,下面就簡單介紹一下項目中的數據庫配置操作. 首選使用express框架自動創建一個測試項目,并在目錄下建立一個專門存放數據庫配置的配置文件,比如:db.js 代碼如下 /* * 數據庫配置文件 * Author: zth * D…

Python 私有變量的訪問和賦值

首先我們這里先描述下&#xff1a;  Python中&#xff0c;變量名類似__x__的&#xff0c;以雙下劃線開頭&#xff0c;并且以雙下劃線結尾的&#xff0c;是特殊變量&#xff0c;特殊變量是可以直接訪問的&#xff08;比如 __doc__, __init__等&#xff09;&#xff0c;不是pri…

SpringBoot入門教程(一)詳解intellij idea搭建SpringBoot

最近公司有一個內部比賽(黑客馬拉松)&#xff0c;報名參加了這么一個賽事&#xff0c;在準備參賽作品的同時&#xff0c;由于參賽服務器需要自己搭建且比賽產生的代碼不能外泄的&#xff0c;所以借著這個機會&#xff0c;本地先寫了個測試的demo&#xff0c;來把tomcat部署相關…

文藝平衡樹 Splay 學習筆記(1)

&#xff08;這里是Splay基礎操作&#xff0c;reserve什么的會在下一篇里面講&#xff09; 好久之前就說要學Splay了&#xff0c;結果茍到現在才學習。 可能是最近良心發現自己實在太弱了&#xff0c;聽數學又聽不懂只好多學點不要腦子的數據結構。 感覺Splay比Treap良心多了—…

JS使用XMLHttpRequest對象POST收發JSON格式數據

JavaScirpt中的XMLHttpRequest對象提供了對 HTTP 協議的完全訪問&#xff0c;使用該對象可以在不刷新頁面的情況與服務器交互數據。XMLHttpRequest是實現AJAX技術的關鍵對象&#xff0c;本站曾整理過一篇介紹該對象的文章&#xff1a; JS使用XMLHttpRequest對象與服務器進行數據…

ShopXO本地化部署安裝之centeros 安裝Apache2.4.6 + PHP7.0.33 + Mysql5.7.25環境

對于centerOS安裝PHP環境&#xff0c;目前網上的帖子都已經比較成熟&#xff0c;具體步驟大家可以自行搜索查看&#xff0c;但是在安裝過程中遇到的一些小細節&#xff0c;這些內容往往需要結合多個帖子才能找到答案&#xff0c;在這里簡單記錄一下。 細節一 如果使用的阿里云…

Spring Boot 擴展點應用之工廠加載機制

Spring 工廠加載機制&#xff0c;即 Spring Factories Loader&#xff0c;核心邏輯是使用 SpringFactoriesLoader 加載由用戶實現的類&#xff0c;并配置在約定好的META-INF/spring.factories 路徑下&#xff0c;該機制可以為框架上下文動態的增加擴展。 該機制類似于 Java SPI…

Vue.js使用-http請求

Vue.js使用-ajax使用 1.為什么要使用ajax 前面的例子&#xff0c;使用的是本地模擬數據&#xff0c;通過ajax請求服務器數據。 2.使用jquery的ajax庫示例 new Vue({el: #app,data: {searchQuery: ,columns: [{name: name, iskey: true}, {name: age},{name: sex, dataSource:…