1、作為我們的第一個目標,讓我們創建一個web頁面來輸出這個著名的示例消息:Hello world。如果您在沒有web框架的情況下發布了一個簡單的Hello world web頁面,那么您只需將Hello world輸入到一個文本文件中,並將其命名為Hello.html文件,並將其上傳到某個web服務器上的某個目錄。請注意在這個過程中您已經指定網頁的兩條最重要的信息:其內容(字符串“Hello world”)和它的URL(例如,http://www.example.com/hello.html)。
2、在Django的情況下,你可以指定這兩件事,但以不同的方式。該頁面的內容由一個視圖函數生成,URL在URLconf中指定。首先,讓我們來編寫Hello world視圖函數。
我們在上一章創建的內部mysite目錄中的第一個視圖,創建一個名為views.py的空文件。這個Python模塊將包含本章的視圖。確保將文件放在內部mysite目錄中,即mysite\mysite\ 目錄,而不是包含manage.py的目錄。我們的Hello world視圖很簡單。這里是整個函數,加上import語句,您應該將它們輸入到views.py文件中。
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
讓我們一次一步一步地完成這一行代碼:首先,我們導入類的類,它位於django中http模塊。我們需要導入這個類,因為它稍后在我們的代碼中使用。
接下來,我們定義一個名為hello視圖函數的函數。每個視圖函數至少需要一個參數,按約定稱為請求。這是一個包含觸發該視圖的當前web請求的信息,也是類django.http..http的一個實例。
在本例中,我們不使用請求做任何事情,但它必須是視圖的第一個參數。注意,視圖函數的名稱並不重要; 為了讓Django意識到這一問題,它不需要以某種方式命名。
我們在這里稱它為hello,因為這個名字清楚地表明了這個觀點的主旨,但是它也可以被命名為hello_wonderful_beautiful_world,或者同樣令人作嘔的東西。
下一節,你的第一個URLconf,將闡明Django是如何找到這個功能的。這個函數是一個簡單的一行程序:它僅僅返回一個已經用文本“Hello world”實例化的HttpResponse 對象。這里的主要經驗是:視圖僅僅是一個Python函數,它將一個參數作為它的第一個參數,並返回一個關於HttpResponse的實例。
為了讓Python函數成為Django視圖,它必須做這兩件事。(也有例外,但我們稍后會講到。
在這一點上,您的第一個URLconf 需要再一次運行python manage.py runserver 命令,你仍然可以看到Django的信息,在我們的Hello world視圖中沒有任何改變。這是因為我們的mysite項目還不知道hello視圖;我們需要明確地告訴Django,我們在一個特定的URL上激活了這個視圖。
繼續我們之前的關於發布靜態HTML文件的類比,現在我們已經創建了HTML文件,但是沒有將它上傳到服務器上的一個目錄中。
為了將視圖函數與Django的特定URL連接在一起,我們使用了一個URLconf。
URLconf類似於您的django驅動的web站點的內容表。基本上,它是url和應該調用這些url的視圖函數之間的映射。這是你告訴Django的,因為這個URL,調用這個代碼,並為那個URL調用代碼。例如,當某人訪問URL/foo/時,調用視圖函數fooview(),它位於Python模塊views.py中。
在前一章中執行了django-admin startproject時,腳本為您自動創建了一個URLconf:文件urls.py。
默認情況下,它是這樣的
"""mysite URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
如果我們忽略文件頂部的文檔注釋,這里是URLconf的本質
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
讓我們一次一步一步地完成這段代碼:第一行從django.conf.urls模塊 導入兩個函數。包括允許您將完整的Python導入路徑包含到另一個URLconf模塊,以及使用正則表達式將瀏覽器中的url與Django項目中的模塊匹配的url。第二行從django.contrib模塊中
調用函數admin。這個函數由include函數調用,以加載Django管理站點的url。
第三行是urlpatterns
,一個簡單的url()實例列表。
這里要注意的主要問題是可變的urlpatterns,Django希望在你的URLconf模塊中找到它。這個變量定義了url和處理這些url的代碼之間的映射。要向URLconf添加URL和視圖,只需在URL模式和視圖函數之間添加一個映射。這里是如何在hello視圖中連接
from django.conf.urls import url from django.contrib import admin from mysite.views import hello urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/$', hello), ]
我們在這里做了兩個更改:首先,我們從它的模塊mysite/views.py中導入hello視圖,它轉化為mysite。Python導入語法中的視圖。(這個假設mysite /views.py在您的Python路徑上。)接下來,我們向 urlpatterns 添加了行url(r'hello/$',hello)。這 一行被稱為URLpattern。這個url()函數告訴Django如何處理你正在配置的url。第一個參數是一個模式匹配字符串(一個正則表達式;更詳細地討論這個)第二個參數是用於該模式的視圖函數。url()也可以選擇其他可選的參數,我們將在第7章更深入地討論這個問題。
我們在這里介紹的一個更重要的細節是正則表達式字符串前面的r字符。
這告訴Python,字符串是一個原始字符串,它的內容不應該解釋反斜杠。
在普通的Python字符串中,反斜杠用於轉義字符串n中的特殊字符,字符串n是一個包含換行符的字符字符串。
當您將r添加為一個原始字符串時,Python並沒有應用它的反斜杠,因此r'\n'是一個包含一個文本反斜杠和一個小寫n的雙字符字符串。
Python的反斜杠和正則表達式中找到的反斜杠之間存在自然沖突,所以在您重新定義Django的正則表達式時,最好使用原始字符串。
簡單地說,我們剛剛告訴Django,任何對URL/hello/ 的請求都應該由hello視圖函數處理。
值得討論的是這個URLpattern的語法,因為它可能不那么明顯。
盡管我們想要匹配URL/hello/,但是模式看起來有點不同。
這是為什么
Django在檢查URL模式之前,從每個輸入的URL前刪除了這個斜杠。
這意味着我們的URLpattern不包括/hello/中的主要斜杠。
一開始,這可能看起來不太直觀,但這一要求簡化了諸如在其他URLconfs中包含URLconfs的內容,我們將在第7章中介紹。
該模式包括一個caret (^)和一個美元符號($)。
這些是具有特殊含義的正則表達式字符:caret (^)意味着模式與字符串的開始匹配,而美元符號表示模式與字符串的結尾匹配。
這個概念最好用例子來解釋,如果我們使用的是模式hello/(在最后沒有美元符號), If we had instead used the pattern ^hello/(without a dollar sign at the end), then any URL starting with /hello/ would match, such as /hello/foo and /hello/bar, not just /hello/.
Similarly 類似地, if we had left off 保留 the initial caret character (i.e., hello/$), Django would match 匹配 any URL that ends with hello/, such as /foo/bar/hello/. If we had simply used hello/, without a caret or dollar sign, then any URL containing 包含 hello/ would match, such as /foo/hello/bar.Thus, 因此 we use both the caret and dollar sign to ensure 確保 that only the URL /hello/ matches nothing more 更多, nothing less 更少.