1. 程式人生 > 實用技巧 >時鐘無縫切換

時鐘無縫切換

一 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