1. 視圖簡介
- 視圖負責接收 web 請求并返回 web 響應。
- 視圖就是一個 python 函數,被定義在 views.py 中。
- 響應可以是一張網頁的 HTML 內容、一個重定向、一個 404 錯誤等等。
響應處理過程如下圖:
- 用戶在瀏覽器中輸入網址:www.demo.com/1/100
- Django 獲取網址信息,去除域名和端口后剩下 URI:1/100
- 按照 urlconf 中正則的配置順序逐一匹配,一旦匹配成功,則調用對應的視圖函數
- 調用對應的視圖函數,接收 request 對象(及正則中獲取的值),處理并返回 response 對象
2. URLconf
在項目目錄下的 settings.py 中通過 ROOT_URLCONF 指定根級 url 的配置:
ROOT_URLCONF = 'ViewDemo.urls'
項目目錄下的 urls.py 中的 urlpatterns 是一個包含 url() 實例的列表。一個 url() 對象包括:
- 正則表達式
- 視圖函數
- 名稱 name
1)關聯各應用下的 URLconf
在應用中創建 urls.py,定義本應用中的 urlconf。如 hero_info 應用目錄下的 urls.py:
urlpatterns = [url(r'^$', views.index, name='index'), # 正則匹配成功時訪問index函數url(r'^([0-9]+)/$', views.detail, name='detail'), # 正則匹配成功時訪問detail函數
]
再在項目的 urls.py 中使用 include() 關聯對應應用的 urls.py:
urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^hero_info/', include('hero_book.urls', namespace='hero_info')), # 關聯hero_book包下的urls.py
]
使用 include 可以去除 urlconf 的冗余。
注意:django 2.0 起,urls 不支持正則表達式問題。如果需要使用正則,需要導入 re_path:
from django.urls import path, re_pathurlpatterns = [path('admin/', admin.site.urls),re_path(r'^test-(\d+)-(\d+)/', views.test),path('index/', views.index),
]
匹配過程
解析 web 請求地址時,先與主 URLconf 匹配,成功后再用剩余的部分與應用中的 URLconf 匹配。如下示例:
- 請求 http://www.demo.cn/hero_info/1/
- 匹配部分是 /hero_info/1/
- 在 settings.py 中與“hero_info/”匹配成功,再用“1/”與 hero_info 應用的 urls 匹配成功
2)URLconf 的編寫
- url 的正則表達式不需要添加一個前導的反斜杠,如應該寫作'hero_info/',而不應該寫作'/hero_info/'。
- 每個正則表達式前面的 r 表示字符串不轉義。
- 請求的 url 被看做是一個普通的 python 字符串,進行匹配時不包括 get 或 post 請求的參數及域名。
http://www.itcast.cn/python/1/?i=1&p=new # 只匹配“/python/1/”部分
- 若要從 url 中捕獲一個值,則要使用正則中的分組。
- 優先使用命名參數,如果沒有命名參數則使用位置參數。
- 每個捕獲的參數都作為一個普通的 python 字符串傳遞給視圖。
url(r'^([0-9]+)/$', views.detail, name='detail') # 通過位置參數傳遞給視圖
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail') # 通過分組名稱傳遞參數給視圖函數,本例的參數名稱為id
3)namespace 反向解析
在 include 中通過 namespace 定義命名空間,用于反向解析。
URL 的反向解析
問題:如果在視圖、模板中使用硬編碼的鏈接,在 urlconf 發生改變時,維護是一件非常麻煩的事情。
解決:在做鏈接時,通過指向 urlconf 中的 namespace 名稱,動態生成鏈接地址。
- 視圖:使用 django.core.urlresolvers.reverse() 函數。
- 模板:使用 url 模板標簽。
3. 視圖函數&錯誤視圖
視圖本質就是一個函數。在應用目錄下默認有 views.py 文件,一般視圖都定義在這個文件中。
視圖的參數:
- 一個 HttpRequest 實例
- 通過正則表達式分組獲取的位置參數或關鍵字參數
如果處理功能過多,可以將函數定義到不同的 py 文件中(但不建議)。示例:
# 新建views1.py
from django.http import HttpResponsedef index(request):return HttpResponse("你好")# 在urls.py中修改配置
from . import views1
url(r'^$', views1.index, name='index'),
錯誤視圖
Django 原生自帶了幾個默認視圖用于處理 HTTP 錯誤。
404 (page not found) 視圖
- 默認的 404 視圖將傳遞一個變量 request_path 給模板,它是導致錯誤的 url。
- 如果Django在檢測URLconf中的每個正則表達式后沒有找到匹配的內容時,將調用 404 視圖。
- 如果在 settings.py 中 DEBUG 設置為 True,那么將永遠不會調用 404 視圖,而是顯示 URLconf。 并帶有一些調試信息。
1)在 templates 中創建 404.html:
2)編寫 404.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{{request_path}}
<h1>Oops!該網頁不存在..</h1>
</body>
</html>
3)在 settings.py 中修改兩個配置:
DEBUG = False # 取消調試狀態
ALLOWED_HOSTS = ['*', ] # 允許所有主機訪問
4)訪問不存在的地址: