時鐘無縫切換
一 Django中路由的作用
URL配置(URLconf)就像Django所支撐網站的目錄,它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;你就是以這種方式告訴Django,對於客戶端發來的某個URL呼叫哪一段邏輯程式碼對應執行
典型例子:
from django.urls import path
urlpatterns = [
path('articles', views.special),
]
articles這個路由對應著檢視函式中special這個方法,瀏覽器輸入這個連結,就會響應到special這個函式來執行
二 簡單的路由配置
1 路由引數
from django.conf.urls import url urlpatterns = [ url(正則表示式, views檢視函式,引數,別名), ]
- 正則表示式:一個正則表示式字串,用於匹配瀏覽器輸入的url根目錄下的檔案地址
- views駛入函式:一個可呼叫物件,通常為一個檢視函式或一個指定檢視函式路勁的字串
- 引數:可選的要傳遞給檢視函式的預設引數(字典形式),注意檢視函式需要相應的形參去接收
- 別名:一個可選的name引數,,用作方向解析
注意:
- 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。
- 不需要新增一個前導的反斜槓,因為每個URL 都有。例如,應該是
^articles
而不是^/articles
。 - 每個正則表示式前面的'r' 是可選的但是建議加上。它告訴Python 這個字串是“原始的” —— 字串中任何字元都不應該轉義
- urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表示式,一旦匹配成功則不再繼續
2 訪問根路徑,觸發檢視函式執行(路由怎麼配)
-url(r'^$',admin.site.urls)
3 在路由配置多個相同路由會怎麼樣
from django.conf.urls import url urlpatterns = [ url(r'^login',views.login), url(r'^login',views.login) ] ''' 因為路由配置的過程是從上到下的一個迴圈,正則會按照從上到下的順序去匹配根目錄下的地址, /login/ 一旦被第一個路由配置成功後,就不會被第二個路由配置就算能表面看能配置成功 ''' urlpatterns = [ url(r'^login',views.login), url(r'^login2',views.login) ] ''' 這個也是同理,外界輸入/login2/也是正則先被r'^login'匹配到, 如果真有這樣的需求那麼要嚴格書寫指定結尾,如下 ''' urlpatterns = [ url(r'^login',views.login), url(r'^login2$',views.login) ]
三 APPEND_SLASH
# 是否開啟url訪問地址後面沒有/跳至帶有/的路徑配置項
APPEND_SLASH=True
Django settings.py配置檔案中預設沒有 APPEND_SLASH 這個引數,但 Django 預設這個引數為 APPEND_SLASH = True。 其作用就是自動在網址結尾加'/',第一次訪問不到之後,再第二次訪問加上'/'然後訪問到了,相當於重定向了一次
其效果就是:
我們定義了urls.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
訪問 http://www.example.com/blog 時,預設將網址自動轉換為 http://www.example/com/blog/ 。
如果在settings.py中設定了 APPEND_SLASH=False,此時我們再請求 http://www.example.com/blog 時就會提示找不到頁面。
四 有名分組 無名分組
1 無名分組的使用
# 無名分組,把分組分出來的值,當做位置引數傳遞給檢視函式
url(r'^index/([0-9]{4})/([0-9]{2})', views.index)
通過正則中的分組將URL下的地址拆分成幾個引數
2 有名分組的使用
# 有名分組,把分組出來的值,當做關鍵字引數傳遞給檢視函式
url(r'^login/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.login),
這個實現與前面的例項完全相同,只有一個細微的差別:捕獲的值作為關鍵字引數而不是位置引數傳遞給檢視函式,這以為這你的URLconf會更加明晰且不容易產生引數順序問題的錯誤 —— 你可以在你的檢視函式定義中重新安排引數的順序。當然,這些好處是以簡潔為代價;
3 案例
# ilovejaney/p/13748739.html
# 這種地址,把人名和id區分開
# 有名分組
url(r'(?P<name>.*?)/p/(?P<id>\d+).html',views.article)
# 無名分組
url(r'^(.*?)/p/(\d+).html',views.article)
#在瀏覽器輸入的連結與為該連結執行的函式形成對映關係,那麼在對映時,會自動該連結會自動給該函式傳入一個requeset,裡面封裝了url的http請求協議中的內容,由於經過了伺服器已經轉換成變數。所以在執行函式時,可在函式內部通過requeset呼叫http協議中的內容。最後在加上分組時所形成的引數,那麼對應的函式需要在已有request形參的基礎上多出相應的形參。
4 偽靜態
原來動態頁面/login 做成/login.html 偽裝成靜態頁面,便於seo優化
seo優化:百度等搜尋引擎會自動將動態頁面的權重降低,因為動態頁面隨時可以變包括其搜尋的關鍵字,所以要偽裝成靜態頁面通過 .html的形式
https://www.cnblogs.com/liuqingzheng/articles/9509792.html
五 路由分發
#作用:隨著專案中的功能增多那麼其中的app也會變多,其中對映表更是數不勝數,如果全部一股腦都放在了總路由中,那麼極難管理,而且易於產生名稱的衝突,所以需要一個路由分發的方式去解決問題。
1 有一個總路徑,根路由,總路由負責做分發
2 每個app有自己的路由和檢視函式的對應關係
3 使用:
-1 在根路由中配置
# 路由分發
# 第一種方式
url(r'^app10',include('app10.urls'))
# 第二種方式
url(r'^app10,include(urls)') #需要事先匯入app10模組
-2 在不同app新建urls.py
urlpatterns = [
url(r'login/', views.login),
url(r'home/', views.home)
]
-3 http://127.0.0.1:8000/app01/login/ 先匹配app01,如果成功分發到app01的urls中繼續匹配
(重頭開始)模糊匹配
六 反向解析
在使用Django 專案時,一個常見的需求是獲得URL 的最終形式,以用於嵌入到生成的內容中(檢視中和顯示給使用者的URL等)或者用於處理伺服器端的導航(重定向等)。人們強烈希望不要硬編碼這些URL(費力、不可擴充套件且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。
在需要URL 的地方,對於不同層級,Django 提供不同的工具用於URL 反查:
- 在模板中:使用url 模板標籤。
- 在Python 程式碼中:使用
from django.urls import reverse()函式
urlpatterns = [
url(r'^login',views.login,name='home'),
]
1 通過路由的別名,解析出路由的地址
2 用在檢視函式中:
url = reverse('home')
print(url)
3 模板檔案中
{% url 'home' %}
4 作用?
動態根據路由別名獲得路徑,一旦路徑改變,不需要改變其他程式碼,也能獲得其變更後的路徑
其原理:
a=b
b=c
如果a換成了g,那麼c也能通過b實時的得到變更後的g
七 名稱空間
名稱空間(英語:Namespace)是表示識別符號的可見範圍。一個識別符號可在多個名稱空間中定義,它在不同名稱空間中的含義是互不相干的。這樣,在一個新的名稱空間中可定義任何識別符號,它們不會與任何已有的識別符號發生衝突,因為已有的定義都處於其它名稱空間中。
由於name沒有作用域,Django在反解URL時,會在專案全域性順序搜尋,當查詢到第一個name指定URL時,立即返回
我們在開發專案時,會經常使用name屬性反解出URL,當不小心在不同的app的urls中定義相同的name時,可能會導致URL反解錯誤,為了避免這種事情發生,引入了名稱空間。
總 urls.py
#使用步驟
1 在總路由中設定
url(r'^app10',include(('app10.urls','名稱空間的名字')))
或 url(r'^app10',include('app10.urls',namespace='名稱空間的名字'))
#那麼在反解時,app10中的name屬性會在該名稱空間中解析出路由地址,不會因為其他app有相同的name屬性而 跑到其他app中解析路由地址
2 在檢視函式中:
url = reverse('名稱空間的名字:home') # home就是路由的別名
3 模板檔案中使用
{% url '名稱空間的名字:home' %}
例子
#總路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app10/', include('app10.urls'),
url(r'^app20/', include('app20.urls')
]
#app10.urls
urlpatterns = [
url('index', views.index),
url('login', views.login),
url('article', views.article)
]
#app20.urls
urlpatterns = [
url('index', views.index,name='home'),
url('login', views.login),
url('article', views.article)
]
#app10.views
def index(request):
url=reverse('home')
print(url)
return HttpResponse('index')
#輸出
>>>/app20/index
示範
#總路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app10/', include(('app10.urls', 'app10'))), #分別加上名稱空間
url(r'^app20/', include(('app20.urls', 'app20'))),
]
#app10.urls
urlpatterns = [
url('index', views.index,name='home'),
url('login', views.login),
url('article', views.article)
]
#app20.urls
urlpatterns = [
url('index', views.index,name='home'),
url('login', views.login),
url('article', views.article)
]
#app10.urls
def index(request):
url=reverse('app10:home')
print(url)
return HttpResponse('index')
#輸出
>>>/app10/index