django 1.8 官方文檔翻譯: 3-1-2 編寫視圖

Django 文檔協(xié)作翻譯小組人手緊缺敞恋,有興趣的朋友可以加入我們,完全公益性質(zhì)谋右。

交流群:467338606

網(wǎng)站:http://python.usyiyi.cn/django/index.html

編寫視圖

一個(gè)視圖函數(shù)硬猫,或者簡短來說叫做視圖,是一個(gè)簡單的Python函數(shù)改执,它接受web請求,并且返回web響應(yīng)辈挂。響應(yīng)可以是一張網(wǎng)頁的HTML內(nèi)容,一個(gè)重定向终蒂,一個(gè)404錯(cuò)誤,一個(gè)XML文檔拇泣,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什么邏輯霉翔,都要返回響應(yīng)。代碼寫在哪里也無所謂债朵,只要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什么神奇的地方”葱弟。為了能夠把代碼放在某個(gè)地方,慣例是把視圖放在叫做views.py的文件中硅卢,然后把它放到你的項(xiàng)目或者應(yīng)用目錄里射窒。

一個(gè)簡單的視圖

下面是一個(gè)返回當(dāng)前日期和時(shí)間作為HTML文檔的視圖:

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

讓我們逐行閱讀上面的代碼:

  • 首先将塑,我們從 django.http模塊導(dǎo)入了HttpResponse類,以及Python的datetime庫点寥。
  • 接著,我們定義了current_datetime函數(shù)蔽莱。它是一個(gè)視圖函數(shù)。每個(gè)視圖函數(shù)都應(yīng)接收HttpRequest對象作為第一個(gè)參數(shù)盗冷,一般叫做request同廉。
  • 注意視圖函數(shù)的名稱并不重要仪糖;不需要用一個(gè)統(tǒng)一的命名方式來命名迫肖,以便讓Django識別它。我們將其命名為current_datetime蟆湖,是因?yàn)檫@個(gè)名稱能夠精確地反映出它的功能。
  • 這個(gè)視圖會(huì)返回一個(gè)HttpResponse對象稠集,其中包含生成的響應(yīng)。每個(gè)視圖函數(shù)都要返回HttpResponse對象。(有例外痹籍,我們接下來會(huì)講。)

Django中的時(shí)區(qū)

Django中包含一個(gè)TIME_ZONE設(shè)置蹲缠,默認(rèn)為America/Chicago棺克∠叨ǎ可能并不是你住的地方,所以你可能會(huì)在設(shè)置文件里修改它斤讥。

把你的URL映射到視圖

所以,再重復(fù)一遍,這個(gè)視圖函數(shù)返回了一個(gè)包含當(dāng)前日期和時(shí)間的HTML頁面搀缠。你需要?jiǎng)?chuàng)建URLconf來展示在特定的URL這一視圖近迁; 詳見URL 分發(fā)器艺普。

返回錯(cuò)誤

在Django中返回HTTP錯(cuò)誤是相當(dāng)容易的鉴竭。有一些HttpResponse的子類代表不是200(“OK”)的HTTP狀態(tài)碼歧譬。你可以在request/response文檔中找到所有可用的子類搏存。你可以返回那些子類的一個(gè)實(shí)例,而不是普通的HttpResponse 祭埂,來表示一個(gè)錯(cuò)誤。例如:

from django.http import HttpResponse, HttpResponseNotFound

def my_view(request):
    # ...
    if foo:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        return HttpResponse('<h1>Page was found</h1>')

由于一些狀態(tài)碼不太常用舌界,所以不是每個(gè)狀態(tài)碼都有一個(gè)特化的子類泰演。然而呻拌,如HttpResponse文檔中所說的那樣睦焕,你也可以向HttpResponse的構(gòu)造器傳遞HTTP狀態(tài)碼,來創(chuàng)建你想要的任何狀態(tài)碼的返回類垃喊。例如:

from django.http import HttpResponse

def my_view(request):
    # ...

    # Return a "created" (201) response code.
    return HttpResponse(status=201)

由于404錯(cuò)誤是最常見的HTTP錯(cuò)誤,所以處理這一錯(cuò)誤的方式非常便利初家。

Http404異常

class django.http.Http404

當(dāng)你返回一個(gè)像HttpResponseNotFound這樣的錯(cuò)誤時(shí),它會(huì)輸出這個(gè)錯(cuò)誤頁面的HTML作為結(jié)果:

return HttpResponseNotFound('<h1>Page not found</h1>')

為了便利起見溜在,也因?yàn)槟愕恼军c(diǎn)有個(gè)一致的404頁面是個(gè)好主意他托,Django提供了Http404異常掖肋。如果你在視圖函數(shù)中的任何地方拋出Http404異常,Django都會(huì)捕獲它志笼,并且?guī)螲TTP404錯(cuò)誤碼返回你應(yīng)用的標(biāo)準(zhǔn)錯(cuò)誤頁面沿盅。

像這樣:

from django.http import Http404
from django.shortcuts import render_to_response
from polls.models import Poll

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404("Poll does not exist")
    return render_to_response('polls/detail.html', {'poll': p})

為了盡可能利用 Http404籽腕,你應(yīng)該創(chuàng)建一個(gè)用來在404錯(cuò)誤產(chǎn)生時(shí)展示的模板。這個(gè)模板應(yīng)該叫做404.html南窗,并且在你的模板樹中位于最頂層郎楼。

如果你在拋出Http404異常時(shí)提供了一條消息万伤,當(dāng)DEBUG為True時(shí)它會(huì)出現(xiàn)在標(biāo)準(zhǔn)404模板的展示中呜袁。你可以將這些消息用于調(diào)試;但他們通常不適用于404模板本身阶界。

自定義錯(cuò)誤視圖

Django中默認(rèn)的錯(cuò)誤視圖對于大多數(shù)web應(yīng)用已經(jīng)足夠了,但是如果你需要任何自定義行為膘融,重寫它很容易。只要在你的URLconf中指定下面的處理器(在其他任何地方設(shè)置它們不會(huì)有效)春畔。

handler404覆蓋了page_not_found()視圖:

handler404 = 'mysite.views.my_custom_page_not_found_view'

handler500覆蓋了server_error()視圖:

handler500 = 'mysite.views.my_custom_error_view'

handler403覆蓋了permission_denied()視圖:

handler403 = 'mysite.views.my_custom_permission_denied_view'

handler400覆蓋了bad_request()視圖:

handler400 = 'mysite.views.my_custom_bad_request_view'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岛都,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臼疫,更是在濱河造成了極大的恐慌,老刑警劉巖烫堤,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡料仗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門格粪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏吊,“玉大人帐萎,你說我怎么就攤上這事比伏〗迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵悠菜,是天一觀的道長。 經(jīng)常有香客問我悔醋,道長兽叮,這世上最難降的妖魔是什么芬骄? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任账阻,我火速辦了婚禮,結(jié)果婚禮上宰僧,老公的妹妹穿的比我還像新娘。我一直安慰自己琴儿,他們只是感情好嘁捷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雄嚣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缓升。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天骇吭,我揣著相機(jī)與錄音歧寺,去河邊找鬼燥狰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛龙致,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屈梁,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼像啼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忽冻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤遮婶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旗扑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臀防,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年边败,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑窜。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡排截,死狀恐怖嫌蚤,靈堂內(nèi)的尸體忽然破棺而出断傲,到底是詐尸還是另有隱情,我是刑警寧澤认罩,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站抡锈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏床三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一撇簿、第九天 我趴在偏房一處隱蔽的房頂上張望差购。 院中可真熱鬧四瘫,春花似錦欲逃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诚纸。三九已至,卻和暖如春畦徘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背井辆。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工画髓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掘剪,地道東北人奈虾。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像肉微,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碉纳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容