版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Python Web開發(fā)基礎(chǔ)教程(Django版)第5章 視圖視圖(View)是Django的MTV架構(gòu)中的重要組成部分,它實現(xiàn)業(yè)務(wù)邏輯處理,決定如何處理用戶請求和生成響應(yīng)內(nèi)容,并在Web頁面或其他文檔中顯示響應(yīng)結(jié)果。本章主要內(nèi)容:定義視圖處理請求和響應(yīng)在視圖中使用模型基于類的視圖5.1 定義視圖Django的視圖也可稱為視圖函數(shù),即用Python函數(shù)來定義視圖。視圖函數(shù)接受Web請求,函數(shù)返回值就是響應(yīng)內(nèi)容。響應(yīng)的內(nèi)容可以是網(wǎng)頁的HTML代碼、XML文檔、圖像或者其他格式的內(nèi)容。視圖函數(shù)代碼文件稱為視圖文件,文件名按慣例使用views.py,當(dāng)然也可以使用其他的文件名。視圖文件放在項目的同名
2、子文件夾或項目的應(yīng)用文件夾中。本節(jié)主要內(nèi)容定義和使用視圖返回錯誤處理Http404異常5.1.1定義和使用視圖定義視圖指在視圖文件中實現(xiàn)完成業(yè)務(wù)邏輯處理的函數(shù)。例如,下面代碼中的showData函數(shù)在Web頁面中顯示當(dāng)前日期和從URL路徑中獲取的數(shù)據(jù)。#chapter5chapter5views.pyfrom django.http import HttpResponsefrom datetime import datedef showData(request,urlData): d=date.today() s=URL路徑中的數(shù)據(jù):%s當(dāng)前日期:%s %(urlData,d) return
3、HttpResponse(s)完成視圖函數(shù)定義后,在URL配置文件中配置URL來訪問該函數(shù)示例代碼如下。#chapter5chapter5urls.pyfrom django.urls import pathfrom . import views#導(dǎo)入視圖模塊urlpatterns = path(test, views.showData) #將URL 映射到視圖函數(shù)5.1.2返回錯誤Django可以返回HTTP狀態(tài)碼和狀態(tài)描述信息。正常情況下,視圖函數(shù)返回的HttpResponse對象的狀態(tài)代碼為200,表示服務(wù)器正確處理了響應(yīng)。Django還提供了一系列HttpResponse子類來返回各種
4、HTTP響應(yīng),如表5-1所示。表5-1HttpResponse子類HttpResponse子類HTTP狀態(tài)碼說明HttpResponseRedirect302重定向到指定URL。HttpResponsePermanentRedirect301返回永久重定向。HttpResponseNotModified304表示自上次請求以來未修改頁面。HttpResponseBadRequest400表示請求有錯誤。HttpResponseNotFound404表示未找到請求的內(nèi)容。HttpResponseForbidden403表示禁止訪問請求的內(nèi)容。HttpResponseNotAllowed405表示
5、禁止使用指定的請求方法。HttpResponseGone410表示訪問請求的內(nèi)容已經(jīng)不存在。HttpResponseServerError500表示發(fā)生服務(wù)器內(nèi)部錯誤。5.1.3處理Http404異常HTTP 404錯誤表示服務(wù)器未找到客戶請求的內(nèi)容,這是最常見的HTTP錯誤。為了方便用戶處理HTTP 404錯誤,Django提供了一個Http404異常類??稍诖a中用raise語句拋出Http404異常,示例代碼如下。#chapter5chapter5views.pyfrom django.http import Http404from django.http import HttpResp
6、onsedef testHttp404(request): raise Http404(親:沒有找到你需要的內(nèi)容!) return HttpResponse(ok)相應(yīng)的URL配置如下:path(test404, views.testHttp404), 5.2處理請求和響應(yīng)Django使用HttpRequest對象處理HTTP請求,使用HttpResponse對象處理HTTP響應(yīng)。HttpRequest和HttpResponse類在django.http模塊中定義。接收到客戶端響應(yīng)時,Django首先創(chuàng)建一個HttpRequest對象,該對象封裝了請求相關(guān)的數(shù)據(jù)。然后Django調(diào)用匹配的視圖
7、函數(shù),將HttpRequest對象傳遞給視圖函數(shù)的第一個參數(shù)。視圖函數(shù)負(fù)責(zé)返回一個HttpResponse對象,該對象封裝了響應(yīng)相關(guān)的數(shù)據(jù)。本節(jié)主要內(nèi)容獲取請求數(shù)據(jù)處理響應(yīng)內(nèi)容文件附件生成CSV文件生成PDF文件返回JSON字符串使用響應(yīng)模板重定向5.2.1獲取請求數(shù)據(jù)可用HttpRequest對象的下列屬性獲取客戶端的請求數(shù)據(jù)。GET:返回一個類字典的對象,它封裝了客戶端使用GET方法上傳的數(shù)據(jù)。POST:返回一個類字典的對象,它封裝了客戶端使用POST方法上傳的數(shù)據(jù)。FILES:返回一個類字典的對象,它封裝了客戶端上傳的所有文件。例如,下面的代碼在瀏覽器中輸出URL中包含的數(shù)據(jù)。#chap
8、ter5chapter5views.pyfrom django.http import HttpResponsedef showGetData(request): s=請求上傳的數(shù)據(jù):姓名=%s,年齡=%s % (request.GETname,request.GETage) return HttpResponse(s)5.2.2處理響應(yīng)內(nèi)容HttpResponse構(gòu)造函數(shù)使用一個字符串參數(shù)來構(gòu)造響應(yīng)內(nèi)容,示例代碼如下。return HttpResponse(一級標(biāo)題)默認(rèn)情況下,響應(yīng)內(nèi)容為HTML格式。如果想返回其他格式的響應(yīng)內(nèi)容,可用content_type參數(shù)設(shè)置內(nèi)容類型以及字符集,示例
9、代碼如下。return HttpResponse(一級標(biāo)題, content_type=text/plain;charset=utf-8)“text/plain”表示內(nèi)容為純文本,“charset=utf-8”設(shè)置了內(nèi)容的字符集。以使用write()函數(shù)向HttpResponse對象添加內(nèi)容,示例代碼如下。#chapter5chapter5views.pyfrom django.http import HttpResponsedef showSomething(request): r=HttpResponse(一級標(biāo)題, content_type=text/plain;charset=utf-
10、8) r.write(第二段) r.write(three) return r5.2.3文件附件Django允許將響應(yīng)內(nèi)容以文件附件的形式返回。要返回文件附件,需要設(shè)置content_type參數(shù)和Content-Disposition標(biāo)頭,示例代碼如下。#chapter5chapter5views.pydef downloadFile(request): r=HttpResponse(文件內(nèi)容, content_type=text/text ;charset=utf-8) rContent-Disposition = attachment; filename=test.txt r.write
11、(ntest) return rContent-Disposition標(biāo)頭中的attachment表示內(nèi)容作為附件傳遞,filename設(shè)置默認(rèn)文件名。相應(yīng)的URL配置如下:path(down, views.downloadFile), 5.2.4生成CSV文件使用Python的csv庫,可以生成CSV格式的文件。生成CSV文件的基本步驟如下。(1)創(chuàng)建HttpResponse對象,并設(shè)置content_type和Content- Disposition。(2)將HttpResponse對象作為csv.writer()的參數(shù),創(chuàng)建CSV生成器。(3)調(diào)用CSV生成器的writerow()、wr
12、iterows()等方法向HttpResponse對象寫入數(shù)據(jù)。(4)返回HttpResponse對象。5.2.5生成PDF文件使用第三方的開源Python庫ReportLab,可以在Django視圖中動態(tài)生成PDF文件。在Windows命令窗口中執(zhí)行下面的命令安裝ReportLab庫。D:pip install reportlab面的代碼使用ReportLab庫生成PDF文件。#chapter5chapter5views.pydef writepdf(request): from reportlab.lib.units import cm from reportlab.pdfbase.ttf
13、onts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.pdfgen import canvas from reportlab.lib.colors import red response = HttpResponse(content_type=application/pdf) responseContent-Disposition = attachment; filename=data.pdf pdfmetrics.registerFont(TTFont(songti,simsun.ttc) #注冊
14、中文字體,其文件在當(dāng)前視圖文件目錄 c = canvas.Canvas(response,pagesize=(10*cm,5*cm) #生成指定大小的PDF畫布 c.setFont(songti,18)#設(shè)置注冊的中文字體,以便正常顯示漢字 c.setFillColor(red)#設(shè)置顏色 c.drawString(0.5*cm,4*cm, Python Django Web簡明教程)#在指定位置輸出字符串 c.showPage()#結(jié)束當(dāng)前頁面 c.save()#保存畫布 return response5.2.6返回JSON字符串JsonResponse是HttpResponse的子類,用于
15、封裝JSON字符串響應(yīng),它將Content-Type的標(biāo)頭設(shè)置為application/json。例如,下面的代碼向客戶端返回一個JSON字符串。#chapter5chapter5views.pydef writejson(request): r=HttpResponse(content_type=application/json;charset=utf-8) r.write(name:張三,data:123,abc) return r修改writejson函數(shù),使用JsonResponse封裝響應(yīng)代碼如下。from django.http import JsonResponsedef wri
16、tejson(request): return JsonResponse(name:張三,data:123,abc)5.2.7使用響應(yīng)模板直接在視圖中通過代碼將內(nèi)容寫入響應(yīng),如果后期需要更改輸出布局,則需要重新修改視圖代碼。這顯然不利于代碼維護(hù)。使用django.template.response模塊中的TemplateResponse類,可以使用模板來定義輸出布局。5.2.8重定向django.shortcuts模塊中的redirect()方法用于快速創(chuàng)建重定向,其基本格式為:redirect(to, *args)參數(shù)to可以是模型中返回URL的方法、視圖名稱或URL。例如:#chapter
17、5chapter5views.pyfrom django.shortcuts import redirectdef useRedirect(request): return redirect(showData,urlData=123)#重定向到5.1.1中定義的視圖函數(shù)showData5.3 在視圖中使用模型視圖不僅可以獲取客戶端上傳的數(shù)據(jù),還可以通過模型訪問后臺的數(shù)據(jù)庫本節(jié)主要內(nèi)容在視圖中輸出模型數(shù)據(jù)數(shù)據(jù)分頁5.3.1在視圖中輸出模型數(shù)據(jù)具體操作步驟如下。(1)在項目子文件夾chapter5中添加一個文件,命名為modes.py,在其中定義模型,代碼如下。(2)在Windows命令窗口中執(zhí)行
18、下面的命令完成數(shù)據(jù)庫遷移操作。(3)修改視圖文件,定義一個函數(shù)將URL中的數(shù)據(jù)添加到數(shù)據(jù)庫的user表,并將user表中的全部數(shù)據(jù)返回客戶端,代碼如下。(4)修改urls.py,添加訪問視圖的URL配置,代碼如下。(5)啟動開發(fā)服務(wù)器。5.3.2數(shù)據(jù)分頁django.core.paginator模塊中的Paginator類用于實現(xiàn)數(shù)據(jù)分頁。1Paginator對象Paginator()構(gòu)造函數(shù)用于創(chuàng)建Paginator對象(稱為分頁器),其基本格式如下。from django.core.paginator import Paginatorpaginator = Paginator(object
19、_list,per_page,orphans = 0,allow_empty_first_page = True)各參數(shù)含義如下:object_list:用于分頁的對象集合,可以是查詢集、元組、列表或者其他可分片對象(帶有count()或_len_()方法的對象)。必選參數(shù)。per_page:每頁中允許的最大對象數(shù)。必選參數(shù)。orphans:用于控制最后一頁的對象數(shù)。如果剩余的對象數(shù)小于或等于orphans值,則這些對象將被添加到上一頁面,并使其成為最后一頁??蛇x參數(shù),默認(rèn)值為0。allow_empty_first_page:是否允許第一頁為空??蛇x參數(shù),默認(rèn)值為True,即允許第一頁為空。P
20、aginator對象的常用屬性如下。count:返回所有頁面中的對象總數(shù)。num_pages:返回總頁數(shù)。page_range:返回頁碼迭代器,頁碼從1開始。例如: from django.core.paginator import Paginator objects=abc,def,ghi,123,456,789#待分頁對象集合 p=Paginator(objects,2)#構(gòu)造分頁器,每頁2個對象 p.count6 p.num_pages3 p.page_rangerange(1, 4)Paginator對象的常用方法如下。get_page(頁碼):返回指定頁的Page對象,頁碼從1開始。
21、該方法可處理超出范圍或無效的頁碼。如果給定頁碼不是數(shù)字,則返回第一頁。如果給定頁碼小于1或大于總頁數(shù),則返回最后一頁。page(頁碼):返回指定頁的Page對象,它不處理超出范圍或無效頁碼。指定的頁碼無效時會觸發(fā)InvalidPage異常。例如: page1=p.get_page(1)#獲取Page對象 page2=p.page(2) #獲取Page對象2Page對象Page對象用于處理指定頁。通常調(diào)用分頁器的page()或get_page()方法獲得Page對象。Page對象的屬性如下。object_list:返回當(dāng)前頁的對象列表。number:返回當(dāng)前頁的頁碼。paginator:返回關(guān)聯(lián)
22、的Paginator對象。Page對象的方法如下。has_next():有下一頁時返回True,否則返回False。has_previous():有上一頁時返回True,否則返回False。has_other_pages():有上一頁或下一頁時返回True,否則返回False。next_page_number():返回下一頁的頁碼。previous_page_number():返回上一頁的頁碼。start_index():返回當(dāng)前頁中第一個對象在所有對象中的索引,索引從1開始。例如,總對象數(shù)為6,每頁包含2個對象,則第二頁的start_index()返回3。end_index():返回當(dāng)前頁中
23、最后一個對象在所有對象中的索引。例如,總對象數(shù)為6,每頁包含2個對象,則第二頁的end_index()返回4。3對模型數(shù)據(jù)分頁5.3.1節(jié)中創(chuàng)建了user模型,其對應(yīng)的user表數(shù)據(jù)如圖5.4 基于類的視圖基于類的視圖指用類實現(xiàn)的視圖,可通過定義其子類進(jìn)行擴(kuò)展。所有基于類的視圖都是django.views.View的子類。本節(jié)主要內(nèi)容使用基于類的視圖設(shè)置視圖類屬性擴(kuò)展視圖類5.4.1使用基于類的視圖典型的基于類的視圖通常由HTTP請求處理方法實現(xiàn),其基本結(jié)構(gòu)如下。from django.http import HttpResponsefrom django.views import Viewc
24、lass MyViewName(View):#繼承View類 #類的屬性定義 #類的方法定義 def get(self, request): # HTTP GET請求處理方法 # 業(yè)務(wù)邏輯處理代碼 return HttpResponse(result) def post(self, request): #HTTP POST請求處理方法 # 業(yè)務(wù)邏輯處理代碼 return HttpResponse(result) 其中,MyViewName是自定義類的名稱,它繼承了django.views.View。get()方法用于處理HTTP GET請求,post()方法用于處理HTTP POST請求。注意
25、,get()和post()的名稱必須小寫。用視圖函數(shù)來處理HTTP請求,其基本結(jié)構(gòu)如下。from django.http import HttpResponsedef MyFuncionName(request): #變量定義 if request.method = GET: #處理HTTP GET請求 # 業(yè)務(wù)邏輯處理代碼 return HttpResponse(result) if request.method = POST: #處理HTTP POST請求 # 業(yè)務(wù)邏輯處理代碼 return HttpResponse(result) Django在解析URL時,如果URL與模式匹配,則調(diào)用
26、相應(yīng)的視圖函數(shù)。在配置基于類的視圖時,需將URL模式映射到視圖類的as_view()方法。Django處理視圖類的基本步驟如下。第一步:執(zhí)行as_view()方法,創(chuàng)建一個類的實例。第二步:調(diào)用setup()方法初始化實例的屬性。第三步:調(diào)用dispatch()方法,根據(jù)HTTP請求方式(GET或POST等)調(diào)用匹配的實例方法。如果沒有匹配的實例方法,則返回HttpResponseNotAllowed響應(yīng)。5.4.2設(shè)置視圖類屬性Django允許在配置基于類的視圖時,在as_view()方法中設(shè)置視圖類的屬性示例代碼如下。#chapter5chapter5urls.pyurlpatterns = path(useviewpara,csrf_exempt(views.useClassView.as_view(news=用指定屬性值訪問視圖類), 5.4.3擴(kuò)展
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《汽車電子控制技術(shù)》教學(xué)大綱
- 《動力電池技術(shù)》教學(xué)大綱
- 震撼人心的130句經(jīng)典語錄
- 玉溪師范學(xué)院《三筆字書寫技法》2022-2023學(xué)年期末試卷
- 玉溪師范學(xué)院《絕版木刻創(chuàng)意制作》2023-2024學(xué)年第一學(xué)期期末試卷
- 顯微鏡的成本核算-記賬實操
- 2023年氨泵項目成效分析報告
- 2019湘美版 高中美術(shù) 選擇性必修4 設(shè)計《第二單元 產(chǎn)品設(shè)計》大單元整體教學(xué)設(shè)計2020課標(biāo)
- 2024屆河北省滄州市普通高中高考一模數(shù)學(xué)試題
- 賓館安保協(xié)議書
- 2024交通安全知識培訓(xùn)
- 淮陰工學(xué)院《產(chǎn)品形態(tài)設(shè)計》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年長沙市事業(yè)單位招聘計算機(jī)崗位專業(yè)知識試題
- 2024年中國家用燃?xì)獠膳癄t市場調(diào)查研究報告
- 2024年中國心力衰竭診斷和治療指南2024版
- 四年級數(shù)學(xué)上冊 第五、六單元過關(guān)檢測卷(蘇教版)
- 2024陜西延長石油集團(tuán)煉化公司操作工校園招聘170人高頻難、易錯點500題模擬試題附帶答案詳解
- 期末模擬練習(xí)(試題)-2024-2025學(xué)年蘇教版二年級上冊數(shù)學(xué)
- 《互聯(lián)網(wǎng)影響新體驗》課件2024--2025學(xué)年人教版(2024)初中信息科技七年級全一冊
- 文旅深度融合績效評估與反饋機(jī)制
- 滬科版七年級上冊數(shù)學(xué)期中考試試卷附答案
評論
0/150
提交評論