在Django中創(chuàng)建第一個(gè)靜態(tài)視圖
正如我們的第一個(gè)目標(biāo),創(chuàng)建一個(gè)網(wǎng)頁(yè),用來(lái)輸出這個(gè)著名的示例信息:
Hello world.
如果你曾經(jīng)發(fā)布過(guò)Hello world頁(yè)面,但是沒(méi)有使用網(wǎng)頁(yè)框架,只是簡(jiǎn)單的在hello.html文本文件中輸入Hello World,然后上傳到任意的一個(gè)網(wǎng)頁(yè)服務(wù)器上。 注意,在這個(gè)過(guò)程中,你已經(jīng)說(shuō)明了兩個(gè)關(guān)于這個(gè)網(wǎng)頁(yè)的關(guān)鍵信息: 它包括(字符串 "Hello world")和它的URL( http://www.example.com/hello.html , 如果你把文件放在子目錄,也可能是 http://www.example.com/files/hello.html)。
使用Django,你會(huì)用不同的方法來(lái)說(shuō)明這兩件事 頁(yè)面的內(nèi)容是靠view function(視圖函數(shù)) 來(lái)產(chǎn)生,URL定義在 URLconf 中。首先,我們先寫一個(gè)Hello World視圖函數(shù)。
在上一章使用django-admin.py startproject制作的mysite文件夾中,創(chuàng)建一個(gè)叫做views.py的空文件。這個(gè)Python模塊將包含這一章的視圖。 請(qǐng)留意,Django對(duì)于view.py的文件命名沒(méi)有特別的要求,它不在乎這個(gè)文件叫什么。但是根據(jù)約定,把它命名成view.py是個(gè)好主意,這樣有利于其他開(kāi)發(fā)者讀懂你的代碼,正如你很容易的往下讀懂本文。
我們的Hello world視圖非常簡(jiǎn)單。 這些是完整的函數(shù)和導(dǎo)入聲明,你需要輸入到views.py文件:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
我們逐行逐句地分析一遍這段代碼:
- 首先,我們從 django.http 模塊導(dǎo)入(import) HttpResponse 類。參閱附錄 H 了解更多關(guān)于 HttpRequest 和 HttpResponse 的細(xì)節(jié)。 我們需要導(dǎo)入這些類,因?yàn)槲覀儠?huì)在后面用到。
- 接下來(lái),我們定義一個(gè)叫做hello 的視圖函數(shù)。
- 每個(gè)視圖函數(shù)至少要有一個(gè)參數(shù),通常被叫作request。 這是一個(gè)觸發(fā)這個(gè)視圖、包含當(dāng)前Web請(qǐng)求信息的對(duì)象,是類django.http.HttpRequest的一個(gè)實(shí)例。在這個(gè)示例中,我們雖然不用request做任何事情,然而它仍必須是這個(gè)視圖的第一個(gè)參數(shù)。
- 注意視圖函數(shù)的名稱并不重要;并不一定非得以某種特定的方式命名才能讓 Django 識(shí)別它。 在這里我們把它命名為:hello,是因?yàn)檫@個(gè)名稱清晰的顯示了視圖的用意。同樣地,你可以用諸如:hello_wonderful_beautiful_world,這樣難看的短句來(lái)給它命名。 在下一小節(jié)(Your First URLconf),將告訴你Django是如何找到這個(gè)函數(shù)的。
- 這個(gè)函數(shù)只有簡(jiǎn)單的一行代碼: 它僅僅返回一個(gè)HttpResponse對(duì)象,這個(gè)對(duì)象包含了文本“Hello world”。
這里主要講的是: 一個(gè)視圖就是Python的一個(gè)函數(shù)。這個(gè)函數(shù)第一個(gè)參數(shù)的類型是HttpRequest;它返回一個(gè)HttpResponse實(shí)例。為了使一個(gè)Python的函數(shù)成為一個(gè)Django可識(shí)別的視圖,它必須滿足這兩個(gè)條件。 (也有例外,但是我們稍后才會(huì)接觸到。
你的第一個(gè)URLconf
現(xiàn)在,如果你再運(yùn)行:python manage.py runserver,你還將看到Django的歡迎頁(yè)面,而看不到我們剛才寫的Hello world顯示頁(yè)面。 那是因?yàn)槲覀兊膍ysite項(xiàng)目還對(duì)hello視圖一無(wú)所知。我們需要通過(guò)一個(gè)詳細(xì)描述的URL來(lái)顯式的告訴它并且激活這個(gè)視圖。 (繼續(xù)我們剛才類似發(fā)布靜態(tài)HTML文件的例子?,F(xiàn)在我們已經(jīng)創(chuàng)建了HTML文件,但還沒(méi)有把它上傳至服務(wù)器的目錄。)為了綁定視圖函數(shù)和URL,我們使用URLconf。
URLconf 就像是 Django 所支撐網(wǎng)站的目錄。 它的本質(zhì)是 URL 模式以及要為該 URL 模式調(diào)用的視圖函數(shù)之間的映射表。 你就是以這種方式告訴 Django,對(duì)于這個(gè) URL 調(diào)用這段代碼,對(duì)于那個(gè) URL 調(diào)用那段代碼。 例如,當(dāng)用戶訪問(wèn)/foo/時(shí),調(diào)用視圖函數(shù)foo_view(),這個(gè)視圖函數(shù)存在于Python模塊文件view.py中。
前一章中執(zhí)行 django-admin.py startproject 時(shí),該腳本會(huì)自動(dòng)為你建了一份 URLconf(即 urls.py 文件)。 默認(rèn)的urls.py會(huì)像下面這個(gè)樣子:
from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # (r'^admin/', include(admin.site.urls)), )
默認(rèn)的URLconf包含了一些被注釋起來(lái)的Django中常用的功能,僅僅只需去掉這些注釋就可以開(kāi)啟這些功能. 下面是URLconf中忽略被注釋的行后的實(shí)際內(nèi)容
from django.conf.urls.defaults import * urlpatterns = patterns('', )
讓我們逐行解釋一下代碼:
- 第一行導(dǎo)入django.conf.urls.defaults下的所有模塊,它們是Django URLconf的基本構(gòu)造。 這包含了一個(gè)patterns函數(shù)。
- 第二行調(diào)用 patterns() 函數(shù)并將返回結(jié)果保存到 urlpatterns 變量。patterns函數(shù)當(dāng)前只有一個(gè)參數(shù)—一個(gè)空的字符串。 (這個(gè)字符串可以被用來(lái)表示一個(gè)視圖函數(shù)的通用前綴。具體我們將在第八章里面介紹。)
當(dāng)前應(yīng)該注意是 urlpatterns 變量, Django 期望能從 ROOT_URLCONF 模塊中找到它。 該變量定義了 URL 以及用于處理這些 URL 的代碼之間的映射關(guān)系。 默認(rèn)情況下,URLconf 所有內(nèi)容都被注釋起來(lái)了——Django 應(yīng)用程序還是白版一塊。 (注:那是上一節(jié)中Django怎么知道顯示歡迎頁(yè)面的原因。 如果 URLconf 為空,Django 會(huì)認(rèn)定你才創(chuàng)建好新項(xiàng)目,因此也就顯示那種信息。
如果想在URLconf中加入U(xiǎn)RL和view,只需增加映射URL模式和view功能的Python tuple即可. 這里演示如何添加view中hello功能.
from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )
請(qǐng)留意:為了簡(jiǎn)潔,我們移除了注釋代碼。 如果你喜歡的話,你可以保留那些行。)
我們做了兩處修改。
- 首先,我們從模塊 (在 Python 的 import 語(yǔ)法中, mysite/views.py 轉(zhuǎn)譯為 mysite.views ) 中引入了 hello 視圖。 (這假設(shè)mysite/views.py在你的Python搜索路徑上。關(guān)于搜索路徑的解釋,請(qǐng)參照下文。)
- 接下來(lái),我們?yōu)閡rlpatterns加上一行: (‘^hello/$', hello), 這行被稱作URLpattern,它是一個(gè)Python的元組。元組中第一個(gè)元素是模式匹配字符串(正則表達(dá)式);第二個(gè)元素是那個(gè)模式將使用的視圖函數(shù)。
簡(jiǎn)單來(lái)說(shuō),我們只是告訴 Django,所有指向 URL /hello/ 的請(qǐng)求都應(yīng)由 hello 這個(gè)視圖函數(shù)來(lái)處理。
Python 搜索路徑
Python 搜索路徑 就是使用 import 語(yǔ)句時(shí),Python 所查找的系統(tǒng)目錄清單。
舉例來(lái)說(shuō),假定你將 Python 路徑設(shè)置為 ['','/usr/lib/python2.4/site-packages','/home/username/djcode/'] 。如果執(zhí)行代碼 from foo import bar ,Python 將會(huì)首先在當(dāng)前目錄查找 foo.py 模塊( Python 路徑第一項(xiàng)的空字符串表示當(dāng)前目錄)。 如果文件不存在,Python將查找 /usr/lib/python2.4/site-packages/foo.py 文件。
如果你想看Python搜索路徑的值,運(yùn)行Python交互解釋器,然后輸入:
>>> import sys >>> print sys.path
通常,你不必關(guān)心 Python 搜索路徑的設(shè)置。 Python 和 Django 會(huì)在后臺(tái)自動(dòng)幫你處理好。
討論一下URLpattern的語(yǔ)法是值得的,因?yàn)樗皇秋@而易見(jiàn)的。 雖然我們想匹配地址/hello/,但是模式看上去與這有點(diǎn)差別。 這就是為什么:
- Django在檢查URL模式前,移除每一個(gè)申請(qǐng)的URL開(kāi)頭的斜杠(/)。 這意味著我們?yōu)?hello/寫URL模式不用包含斜杠(/)。(剛開(kāi)始,這樣可能看起來(lái)不直觀,但這樣的要求簡(jiǎn)化了許多工作,如URL模式內(nèi)嵌,我們將在第八章談及。)
- 模式包含了一個(gè)尖號(hào)(^)和一個(gè)美元符號(hào)($)。這些都是正則表達(dá)式符號(hào),并且有特定的含義: 上箭頭要求表達(dá)式對(duì)字符串的頭部進(jìn)行匹配,美元符號(hào)則要求表達(dá)式對(duì)字符串的尾部進(jìn)行匹配。
- 最好還是用范例來(lái)說(shuō)明一下這個(gè)概念。 如果我們用尾部不是$的模式'^hello/',那么任何以/hello/開(kāi)頭的URL將會(huì)匹配,例如:/hello/foo 和/hello/bar,而不僅僅是/hello/。類似地,如果我們忽略了尖號(hào)(^),即'hello/$',那么任何以hello/結(jié)尾的URL將會(huì)匹配,例如:/foo/bar/hello/。如果我們簡(jiǎn)單使用hello/,即沒(méi)有^開(kāi)頭和$結(jié)尾,那么任何包含hello/的URL將會(huì)匹配,如:/foo/hello/bar。因此,我們使用這兩個(gè)符號(hào)以確保只有/hello/匹配,不多也不少。
- 你大多數(shù)的URL模式會(huì)以^開(kāi)始、以$結(jié)束,但是擁有復(fù)雜匹配的靈活性會(huì)更好。
- 你可能會(huì)問(wèn):如果有人申請(qǐng)?jiān)L問(wèn)/hello(尾部沒(méi)有斜杠/)會(huì)怎樣。 因?yàn)槲覀兊腢RL模式要求尾部有一個(gè)斜杠(/),那個(gè)申請(qǐng)URL將不匹配。 然而,默認(rèn)地,任何不匹配或尾部沒(méi)有斜杠(/)的申請(qǐng)URL,將被重定向至尾部包含斜杠的相同字眼的URL。 (這是受配置文件setting中APPEND_SLASH項(xiàng)控制的,參見(jiàn)附件D。)
- 如果你是喜歡所有URL都以'/'結(jié)尾的人(Django開(kāi)發(fā)者的偏愛(ài)),那么你只需要在每個(gè)URL后添加斜杠,并且設(shè)置”APPEND_SLASH”為”True”. 如果不喜歡URL以斜杠結(jié)尾或者根據(jù)每個(gè)URL來(lái)決定,那么需要設(shè)置”APPEND_SLASH”為”False”,并且根據(jù)你自己的意愿來(lái)添加結(jié)尾斜杠/在URL模式后.
另外需要注意的是,我們把hello視圖函數(shù)作為一個(gè)對(duì)象傳遞,而不是調(diào)用它。 這是 Python (及其它動(dòng)態(tài)語(yǔ)言的) 的一個(gè)重要特性: 函數(shù)是一級(jí)對(duì)象(first-class objects), 也就是說(shuō)你可以像傳遞其它變量一樣傳遞它們。 很酷吧?
啟動(dòng)Django開(kāi)發(fā)服務(wù)器來(lái)測(cè)試修改好的 URLconf, 運(yùn)行命令行 python manage.py runserver 。 (如果你讓它一直運(yùn)行也可以,開(kāi)發(fā)服務(wù)器會(huì)自動(dòng)監(jiān)測(cè)代碼改動(dòng)并自動(dòng)重新載入,所以不需要手工重啟) 開(kāi)發(fā)服務(wù)器的地址是 http://127.0.0.1:8000/ ,打開(kāi)你的瀏覽器訪問(wèn) http://127.0.0.1:8000/hello/ 。 你就可以看到輸出結(jié)果了。 開(kāi)發(fā)服務(wù)器將自動(dòng)檢測(cè)Python代碼的更改來(lái)做必要的重新加載, 所以你不需要重啟Server在代碼更改之后。服務(wù)器運(yùn)行地址`` http://127.0.0.1:8000/`` ,所以打開(kāi)瀏覽器直接輸入`` http://127.0.0.1:8000/hello/`` ,你將看到由你的Django視圖輸出的Hello world。
萬(wàn)歲! 你已經(jīng)創(chuàng)建了第一個(gè)Django的web頁(yè)面。
相關(guān)文章
基于Python實(shí)現(xiàn)通過(guò)微信搜索功能查看誰(shuí)把你刪除了
這篇文章主要介紹了基于Python實(shí)現(xiàn)微信搜索查看誰(shuí)把你刪除了的相關(guān)資料,需要的朋友可以參考下2016-01-01python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python裝飾器用法與知識(shí)點(diǎn)小結(jié)
這篇文章主要介紹了Python裝飾器用法與知識(shí)點(diǎn),總結(jié)分析了Python 裝飾器的基本概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03PyCharm使用之配置SSH Interpreter的方法步驟
這篇文章主要介紹了PyCharm使用之配置SSH Interpreter的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12python pandas 對(duì)series和dataframe的重置索引reindex方法
今天小編就為大家分享一篇python pandas 對(duì)series和dataframe的重置索引reindex方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例
這篇文章主要介紹了TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集的實(shí)現(xiàn)示例的過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11Python中__repr__和__str__區(qū)別詳解
這篇文章主要介紹了Python中__repr__和__str__區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式
這篇文章主要介紹了使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05mac下pycharm設(shè)置python版本的圖文教程
今天小編就為大家分享一篇mac下pycharm設(shè)置python版本的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06