Django - 將URL映射到視圖

  

URLconf 就像是 Django 所支撐網站的目錄。它的本質是 URL 模式以及要爲該 URL 模式調
用的視圖函數之間的映射表。你就是以這種方式告訴 Django,對於這個 URL 調用這段代碼,
對於那個 URL 調用那段代碼。但必須記住的是視圖函數必須位於 Python 搜索路徑之中。
html

Python 搜索路徑

Python 搜索路徑 就是使用 import 語句時, Python 所查找的系統目錄清單。
舉例來講,假定你將 Python 路徑設置爲
['','/usr/lib/python2.4/site-packages','/home/username/djcode/'] 。若是執行代碼
from foo import bar , Python 將會首先在當前目錄查找 foo.py 模塊( Python 路徑第一
項的空字符串表示當前目錄)。若是文件不存在, Python 將查找
/usr/lib/python2.4/site-packages/foo.py 文件。若是文件也不存在,它將嘗試
/home/username/djcode/foo.py 。最後,若是 這個 文件還不存在,它將引起 ImportError
異常。
前端

若是對了解 Python 搜索路徑值感興趣,能夠啓動 Python 交互式解釋程序,輸入 import
sys ,接着輸入 print sys.path 。
python

一般,你沒必要關心 Python 搜索路徑的設置。 Python 和 Django 會在後臺自動幫你處理好。
(若是有興趣瞭解的話, Python 搜索路徑的設置工做是 manage.py 文件的職能之一。 )
程序員

執行 django-admin.py startproject 時,該腳本會自動爲你建了一份 URLconf(即
urls.py 文件)。讓咱們編輯一下這份文件。缺省狀況下它是下面這個樣子:
正則表達式

 

from django.conf.urls import url
from django.contrib import admin

import view

urlpatterns = [
    url(r'^hello', view.djangoStudy),
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',view.index)
]

# urlpatterns = [
#     url(r'^admin/', admin.site.urls),
# ]

 

當前應該注意是 urlpatterns 變量, Django 指望能從 ROOT_URLCONF 模塊中找到它。該變
量定義了 URL 以及用於處理這些 URL 的代碼之間的映射關係
數據庫

 

r'^index/$' 中的 r 表示'^index/$' 是一個原始字符串。這樣一來就能夠避免 正則表達式
有過多的轉義字符。django


沒必要在 '^index/$'前加斜槓(/)來匹配 /index/ , 由於 Django 會自動在每一個表 達式前
添加一個斜槓。乍看起來,這好像有點奇怪,可是 URLconfs 可能由其它的 URLconfs 所引
用, 因此不加前面的斜槓可以讓事情簡單一些。 數組


上箭頭 ^ 和美圓符號 $ 符號很是重要。上箭頭要求表達式對字符串的頭部進行匹配,美圓
符號則要求表達式對字符串的尾部進行匹配。瀏覽器


最好仍是用範例來講明一下這個概念。若是咱們用 '^index/' (結尾沒有$), 那麼以 index/
開始的 任意 URL 都會匹配,好比 /index/foo 和 /index/bar , 不只僅是 /index/ 。一樣的,
若是咱們去掉最前面的 ^ ( 'index/$' ), Django 同樣會匹配由 index/ 結束的 任意 URL
/index/ ,好比 /foo/bar/index/ 。 所以,咱們必須同時用上 ^ 和 $ 來精確匹配 URL
/index/ 。不能多也不能少。服務器

 正則表達式

正則表達式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 容許你 使用
任意的正則表達式來作強有力的 URL 映射,不過一般你實際上可能只須要使用不多的一 部分
功能。下面就是一些經常使用通用模式:

   

Django 是怎麼處理請求的

咱們必須對剛纔所發生的幾件事情進行一些說明。它們是運行 Django 開發服務器和構造 Web
頁面請求的本質所在。
命令 python manage.py runserver 從同一目錄載入文件 settings.py 。 該文件包含了這
個特定的 Django 實例全部的各類可選配置,其中一個最重要的配置就是 ROOT_URLCONF 。
ROOT_URLCONF 告訴 Django 哪一個 Python 模塊應該用做本網站的 URLconf。
還記得 django-admin.py startproject 建立的文件 settings.py 和 urls.py 嗎? 這時
系統自動生成的 settings.py 裏 ROOT_URLCONF 默認設置是 urls.py 。
當訪問 URL /time/ 時, Django 根據 ROOT_URLCONF 的設置裝載 URLconf 。 而後按順序逐
個匹配 URLconf 裏的 URLpatterns,直到找到一個匹配的。當找到這個匹配 的 URLpatterns
就調用相關聯的 view 函數,並把 HttpRequest 對象做爲第一個參數。 (稍後再給出
HttpRequest 的更多信息)
該 view 函數負責返回一個 HttpResponse 對象。
你如今知道了怎麼作一個 Django-powered 頁面了,真的很簡單,只須要寫視圖函數並用
URLconfs 把它們和 URLs 對應起來。你可能會認爲用一系列正則表達式將 URLs 映射到函數也
許會比較慢,但事實卻會讓你驚訝。

views 視圖

 

 接下來請求的處理就到了.../sign/views.py 中的 index 視圖函數

#-*-coding:utf-8-*-
# Time:2017/11/13 17:08
# Author:YangYangJun

from django.http import HttpResponse
from django.shortcuts import render


def djangoStudy(request):
    return HttpResponse('Hello DjangoStudy !')

def index(request):
    return render(request,'index.html')

 視圖在我看來, 它在 Django 中很是重要, 是鏈接頁面與數據的中間紐帶。 拿登陸的例子來說, 用戶在頁
面上輸入了用戶名和密碼點擊登陸。 那麼 request 請求會由視圖來接收, 如何提取出用戶名和密碼的數據, 如 

何用這些數據去查詢數據庫, 再如何將登陸成功的頁面返回給用戶, 這些所有由視圖層來完成。 


Django 如何處理請求: 完整細節
除了剛纔所說到的簡明 URL-to-view 映射方式以外, Django 在請求處理方面提供了大量的靈
活性

經過 URLconf 解析到哪一個視圖函數來返回 HttpResponse 能夠經過中間件(middleware) 來
短路或者加強。關於中間件的細節將在第十五章詳細談論,這裏給出 下圖 讓你先了解 大
體概念.。

當服務器收到一個 HTTP 請求之後,一個服務器特定的 handler 會建立 HttpRequest 並傳遞
給下一個組件並處理。
這個 handler 而後調用全部可用的 Request 或者 View 中間件。這些類型的中間件一般是用
來 加強 HttpRequest 對象來對一些特別類型的 request 作些特別處理。只要其中有一個 返
回 HttpResponse ,系統就跳過對視圖的處理。
即使是最棒的程序員也會有出錯的時候, 這個時候 異常處理中間件(exception middleware) 能夠幫你的
大忙。若是一個視圖函數拋出異常,控制器會傳遞給異常處理中間件處理。若是這個 中間件沒有返回
HttpResponse ,意味着它不能處理這個異常,這個異常將會再次拋出。

 即使是這樣,你也不用擔憂。 Django 包含缺省的視圖來生成友好的 404 和 500 迴應
(response)。
最後, response middleware 作發送 HttpResponse 給瀏覽器以前的後處理或者清除 請求
用到的相關資源。

 簡單實例

新建一個html頁面,命名爲:index.html, urls和view配置如上圖

templates 模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django Page</title>
</head>
<body>
<h1>Hello Django</h1>
</body>
</html>

 模板的載體就是咱們所熟悉的 Web 頁面了, Django 自帶的有模板語言。 它的主要做用是如何展現數據,
好比視圖層返回的是一個字符串, 要如何顯示在頁面上; 返回的對象數組要如何顯示等。 固然, 爲了使頁面
更漂亮須要藉助前端技術, 好比 CSSJavaScript 等。

運行後,結果如圖

 

 Django 簡單的處理流程

相關文章
相關標籤/搜索