Django中url與path及re_path的區別說明
Django中url與path及re_path區別
初學者一般不能分清兩者的區別,所這簡單介紹下兩者.首先,url是Django 1.x中的寫法,p在Django2.1中,開始舍棄django1.x中的url寫法。
在django2.x中,描寫url配置的有兩個函數path和re_path.re_path()函數可以看做是django 1.x中得url函數,即可以在路徑中使用正則.
一.path和url的區別:
django.urls path django.conf.urls url
path與url是兩個不同的模塊,效果都是響應返回頁面, path調用的是python第三方模塊或框架,而url則是自定義的模塊,如Views下的def函數對應你url中的參數值.
例如:
url(r'^login',views.login), def login(request): return render(request,'login.html')
1、url
在settings.py文件中有一個ROOT_URLCONF設置,設置的是在訪問網址時通過哪一個url文件去匹配所請求的網址
url參數
url或者re_path要復雜一些 (r’^blog/(?P[0-9]{4})/′)首先需要開始符和結尾符 ‘) 首先需要開始符^和結尾符 ′)首先需要開始符和結尾符,參數匹配一個 ()就是一個匹配參數,
(?P<匹配的字段名>正則表達式)
進行匹配是不包括get或者post請求方式的參數及域名比如www.qq.com/blog?num=1並不會匹配?後邊的字符
可以給request參數設置一個默認值,最常見的分頁url,比如
urlpatterns=[ url(r'^page/$',views.page), url(r'^page(?P<num>[0-9]+)$',views.page) ] #views def page(request,num='1'): pass
自定義錯誤頁面關鍵字handler400=blog.views.page_no_find
#urls.py … handler400=blog.views.page_no_find
2、path
參數的使用方法path(‘blog/str:string/’) 簡單瞭很多,就是尖括號,前邊是str代表參數的類型,後面代表參數的名稱
path參數類型
捕獲url中的參數需要用到尖括號<> 指定尖括號中的值類型比如int:astr:link這個轉換器還有許多類型比如:
int 匹配0和正整數
str 匹配任何空字符串但不包括/
slug 可理解為註釋 匹配任何ascii碼包括連接線和下劃線
uuid 匹配一個uuid對象(該對象必須包括破折號—,所有字母必須小寫)
path 匹配所有的字符串 包括/(意思就是path前邊和後邊的所有)
3.re_path
如果遇上路徑和轉換器語法都不足以定義的URL模式,那麼就需要使用正則表達式,這時候就需要使用re_path(),而非path()。
舉例:傳遞 數字結尾的參數
re_path(r'(\d+)/$',views.peopleList,name='peopleList'),
二、python3中使用django2,常見設置path問題
1.Django2中使用
在python3中使用django2的時候,在設置urls的時候,會遇到一些坑。這裡做一下記錄。
系統的urls.py裡,在1.X的時候,都是采用的url方式。如下
url(r'^', include("test1.urls")),
在2.0中,它推薦使用的是path模塊,所以這裡就改寫一下。引包
from django.urls import path path('', include("test1.urls")),
註意:
如果要使用正則,則要引入re_path,from django.urls import path, re_path
這裡面的正則寫法,有點意思,一定要使用()把正則包起來,然後用?P正式表達式 這種形式來表式
2.APP中使用path
1.x裡面的寫法是
url(r'^page=(\d+)&key=(\w+)$', views.detail, name=”detail”),
現在的寫法
re_path('page=(?P<page>\d+)&key=(?P<key>\w+)', views.detail, name="detail"),
這樣一對比就能明白瞭吧,使用的鏈接是http://127.0.0.1:8000/page=12&key=abc
3.系統的urls.py裡的namespace的問題
1.x中寫法
url(r'^', include("test1.urls", namespace='test1')),
可是在2.0中你這麼寫,會報錯,說什麼app_name的,這個自己可以看一下,怎麼解決呢,其實很簡單,隻要在自己項目urls.py中加上這句就行瞭.如果不加的話可能報錯,
app_name = 'test1'(你的APP名)
註:
使用url也是可以的,為瞭簡便起見,盡量使用符合版本的字段,另外在寫路徑時應該嚴格按照語法,比如’^’ 和/$就不能缺,不能前面寫url,括號裡面確按照path的寫法,這樣很容易出錯,到瞭關鍵時刻,很難定位問題點,很浪費時間.
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。