django中怎樣生成非HTML格式的內容。

某些時候可能有這種需求。在網頁中點擊一個鏈接或者一個button希望返回一張圖片、一個pdf文檔、一個csv文檔等而非HTML。

在diango中非常easy做到這些。django中的view用來接收http request并返回web response。

通常情況下,返回的內容為HTML,但其可以返回的不只如此。還可以是上述圖片、pdf文件等等。返回非HTML形式的內容的關鍵在于HttpResponse這個類,尤其是mimetype這個參數,通過將此參數設置為不同的值可以提示瀏覽器view返回了不同格式的內容。

比方,想要返回圖片內容,只需讀如一張圖片,然后在HttpResponse中指明圖片的mimetype并將圖片內容作為還有一參數response給瀏覽器,瀏覽器可以自己主動正確的顯示圖片內容。

from django.http import HttpResponsedef my_image(request):image_data = open("/path/to/my/image.png", "rb").read()return HttpResponse(image_data, mimetype="image/png")
另外一個須要特別注意的的是HttpResponse對象實現了Python的標準“file-like-object”API。也即能夠將HttpResponse當做文件使用。
樣例:
生成CSV格式的內容

import csv
from django.http import HttpResponse# Number of unruly passengers each year 1995 - 2005. In a real application
# this would likely come from a database or some other back-end data store.
UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]def unruly_passengers_csv(request):# Create the HttpResponse object with the appropriate CSV header.response = HttpResponse(mimetype='text/csv')response['Content-Disposition'] = 'attachment; filename=unruly.csv'# Create the CSV writer using the HttpResponse as the "file."writer = csv.writer(response)writer.writerow(['Year', 'Unruly Airline Passengers'])for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):writer.writerow([year, num])return response
須要注意的幾點:
1.HttpResponse中mimetype指定為了'text/csv'告知瀏覽器返回的文檔是CSV文件。
2.HttpResponse設置了另外一個參數Content-Disposition當中attachment告知瀏覽器保存返回的文檔而非顯示其內容,filename指明了返回文檔的名字,改名字可隨意指定。


3.由于csv的writer方法期望一個文件類型的對象作為參數,而HttpResponse實例能夠當做文件使用,所以能夠直接在csv模塊的writer方法中將HttpResponse作為參數。


4.writer.writerow方法負責往文件里寫入一行內容。

上述方法是返回非HTML格式內容的通用模式,也即:創建一個特定MIME Type的HttpResponse。將其傳遞給以文件為參數產生特定格式的文檔的方法。之后返回該response。

生成PDF格式的內容

from reportlab.pdfgen import canvas
from django.http import HttpResponsedef hello_pdf(request):# Create the HttpResponse object with the appropriate PDF headers.response = HttpResponse(mimetype='application/pdf')response['Content-Disposition'] = 'attachment; filename=hello.pdf'# Create the PDF object, using the response object as its "file."p = canvas.Canvas(response)# Draw things on the PDF. Here's where the PDF generation happens.# See the ReportLab documentation for the full list of functionality.p.drawString(100, 100, "Hello world.")# Close the PDF object cleanly, and we're done.p.showPage()p.save()return response
流程基本同上,須要注意的幾點:
1.此處使用了 application/pdf MIME type告知瀏覽器返回的是PDF文件。而非HTML。否則瀏覽器會將其作為普通HTML內容處理。
2.canvas.Canvas方法期望一個file-like的對象作為參數,將HttpResponse傳遞給該方法。


3.使用Canvas實例的方法繪制PDF文檔,調用showPage()方法和save()方法(否則會產生損壞的pdf文檔)。
4.最后返回該HttpResponse實例

生成更為復雜的PDF文檔,這里使用了cStringIO庫來暫時存放PDF文件

from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponsedef hello_pdf(request):# Create the HttpResponse object with the appropriate PDF headers.response = HttpResponse(mimetype='application/pdf')response['Content-Disposition'] = 'attachment; filename=hello.pdf'temp = StringIO()# Create the PDF object, using the StringIO object as its "file."p = canvas.Canvas(temp)# Draw things on the PDF. Here's where the PDF generation happens.# See the ReportLab documentation for the full list of functionality.p.drawString(100, 100, "Hello world.")# Close the PDF object cleanly.p.showPage()p.save()# Get the value of the StringIO buffer and write it to the response.response.write(temp.getvalue())return response
其它可能的格式
實質上。不論什么能夠寫文件的Python庫都可與Django的HttpResponse結合用以返回特定格式的內容,如ZIP文件、動態圖片、圖表、XLS文件等等。

最后在看一個返回xls文件的樣例

from django.http import HttpResponse
import xlwt
def viewXls(request):response = HttpResponse(mimetype='application/vnd.ms-excel')  response['Content-Disposition'] = 'attachment; filename=request.xls'    book = xlwt.Workbook(encoding='utf8')   sheet = book.add_sheet('untitled')for row, column, value in ((0,0,1),(0,1,2),(1,0,3),(1,1,4)) sheet.write(int(row),int(column),value)book.save(response)return response
流程同上,不在凝視。

另外。須要特別注意的是,這里的request必須是通過表單提交才干正確返回特定格式的內容,若要是通過ajax方式發起的request則返回的內容會被當做文本串處理,而不能被瀏覽器解釋為特定內容。
比方:
$.ajax({url:"{% url 'mycitsm.views.viewXls' %}",data:postData,type:"POST",success:function(result){},});
//是不能夠的,而要使用例如以下的表單提交才干夠:
var form = $("#xlsForm");
form.attr({action:"{% url 'mycitsm.views.returnXls' %}",method:"POST"        
});
form.submit();
講到這里有必要記錄一下開發過程中遇到的一個問題,也即將表單內容序列化為字符串的問題。


有時需將表單中的全部內容序列化為鍵值對構成的串做為一個總體進行URL參數傳遞,并且須要對值中包括的特殊字符進行編碼。比方有例如以下表單:

<form><div><input type="text" name="a" value="1" id="a" /></div><div><input type="text"  value="2" id="b" /></div><div><input type="hidden" name="c" value="3" id="c" /></div><div><textarea name="d" rows="8" cols="40">4</textarea></div><div><select name="e"><option value="5" selected="selected">5</option><option value="6">6</option><option value="7">7</option></select></div><div><input type="checkbox" name="f" value="8" id="f" /></div><div><input type="submit" name="g" value="Submit" id="g" /></div></form>$('form').submit(function() {alert($(this).serialize());return false;});
#能夠輸出
a=1&c=3&d=4&e=5
為什么第二個text類型的input的值還有checkbox類型的input的值以及submit類型的input沒有被序列化呢?這是由于假設要表單元素的值包括到序列字符串中,元素必須使用 name 屬性。

而第二個text類型的input無name屬性。checkbox類型的input有一個并沒有被checked所以……。

serialize()僅僅會將”成功的控件“序列化為字符串。

假設不使用button來提交表單。則不正確提交button的值序列化,所以submit類型的input沒有被序列化。


當然除了直接對整個form序列化外還可對已選取的個別表單元素的jQuery對象序列化。如<input>,<textarea>等等。





本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Window.document對象

一、找到元素&#xff1a; docunment.getElementById("id")&#xff1b;根據id找&#xff0c;最多找一個&#xff1b; var a docunment.getElementById("id");將找到的元素放在變量中&#xff1b; docunment.getElementsByName("name")&am…

C# 讀寫文件從用戶態切到內核態,到底是個什么流程?

一&#xff1a;背景 1. 一個很好奇的問題我們在學習 C# 的過程中&#xff0c;總會聽到一個詞叫做 內核態 &#xff0c;比如說用 C# 讀寫文件&#xff0c;會涉及到代碼從 用戶態 到 內核態 的切換&#xff0c;用 HttpClient 獲取遠端的數據&#xff0c;也會涉及到 用戶態 到 內核…

C語言九十四之請編寫函數fun(char *str, int n),其功能是:使字符串str的前導*號不能多余n個,若多于n個,則刪除多余的*號,若少于或等于n個,則不做處理。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 規定輸入的…

【土地評價與土地管理】案例:某地區土地農業利用潛力評價

文章目錄 一、確定評價單元二、擬定潛力評價系統表、確定指標權重三、指標評價四、評定潛力等級五、得出潛力評價結果一、確定評價單元 土地潛力評價單元采用地塊作為評價單元,此地塊是建立在土地利用現狀的基礎上, 綜合土地的自然屬性來確定,評價單元界線與土地現有界線基本…

WIKIOI 1519 過路費

1519 過路費 1519 過路費 時間限制: 1 s 空間限制: 256000 KB 題目等級 : 大師 Master 題解 題目描述 Description 在某個遙遠的國家里&#xff0c;有 n個城市。編號為 1,2,3,…,n。這個國家的政府修建了m 條雙向道路&#xff0c;每條道路連接著兩個城市。政府規定從城市…

code point,code unit

2019獨角獸企業重金招聘Python工程師標準>>> 從一段API描述談起&#xff1a; 在String的length的API中描述是這樣的&#xff01; lengthpublic int length() Returns the length of this string. The length is equal to the number of 16-bit Unicode characters i…

Android之解決JsonObject里面的JsonArray數據會有斜杠問題

1、問題 本地保存了多個json格式的字符串 {"event":"sdk_ad_request_status","timestamp":1640180549231,"ad_app_id":"10104","pool_test":0,"ad_type":0,"ad_request_time":0,"requ…

【土地評價與土地管理】案例:蘭州市榆中縣農用地分等

文章目錄 一、資料收集二、確定標準耕作制度、基準作物、指定作物、光溫(氣候生產潛力)三、劃分指標區,確定分等因素及權重四、編制“指定作物-分等因素-自然質量分”記分規則表五、繪制分等因素分值圖,劃分分等單元六、計算農用地自然質量分七、計算自然質量等指數八、計算…

.NET7之MiniAPI(特別篇) :Preview5優化了JWT驗證(下)

Preview5對策略驗證的方式沒有改變&#xff0c;只不過內置了Token的生成&#xff0c;和《.NET6之MiniAPI(十)&#xff1a;基于策略的身份驗證和授權》的驗證方式基本相同&#xff0c;都是生成和驗證使用的驗證參數要一致&#xff0c;用繼承AuthorizationHandler的子類來作每次請…

業務多變的公司上云后蒸蒸日上

一、云服務器與傳統服務器的對比 1&#xff09;、傳統服務器 傳統服務器是一個獨立的硬件設備,可以理解成是一臺放在機房的高配置電腦,可根據需求安裝各種操作系統以及配置各種環境,性能也比較強大。 2&#xff09;、云服務器 云服務器是構建在硬件服務器集群之上&#xff0c;…

2016福州大學軟件工程第四次團隊作業-系統設計成績匯總

第四次團隊作業——系統設計打分統計結果如下&#xff1a; 學號組別團隊分數貢獻比例個人分數031401433606notconnected141613.83031402606606notconnected141413.33031402618606notconnected141814.34031402629606notconnected141413.33031402631606notconnected141914.590314…

[轉]在C#中像Python一樣編寫TensorFlow機器學習代碼

機器學習是一個令人激動人心的領域&#xff0c;一直有新的技術突破。研究人員不斷推動機器智能的提升&#xff0c;教機器如何聽說讀寫——這些曾經是我們人類專屬的技能。機器學習的首選語言是Python&#xff0c;最受歡迎的庫是Google的TensorFlow。幾乎所有的代碼示例都是用Py…

【土地評價與土地管理】教案 第一章:土地評價要素的選擇

文章目錄 1.1 土地構成要素與其農業利用1、光能條件2、熱量條件3、降水條件1.1 土地構成要素與其農業利用 1、光能條件 ? 光能是綠色植物進行光合作用和生物運動發展的主要能源 ? 太陽輻射、日照時數 ? 太陽輻射量隨地域和季節變化較大,導致了土地利用的多樣性和土地資源…

Blazor University (33)表單 —— EditContext、FieldIdentifiers

原文鏈接&#xff1a;https://blazor-university.com/forms/editcontext-fieldidentifiers-and-fieldstate/EditContext、FieldIdentifiers 和 FieldState請注意&#xff0c;對于那些希望了解 Blazor 如何“在后臺”工作的人來說&#xff0c;這是一個高級主題。無需了解此信息即…

Flutter之Container的寬度如何設置為手機屏幕寬度

1、問題 Container的寬度如何設置為手機屏幕寬度 2、解決辦法 width: MediaQuery.of(context).size.width,Row(children: [Container(height: 40,width: MediaQuery.of(context).size.width,// width: double.infinity,color: Colors.red,child: Row(children: [Containe…

團隊項目開發篇章8

例會時間&#xff1a;2016.11.3 整理&#xff1a;姬索肇 例會照片 每個人的工作 任務分配 我們今天與王鹿鳴學長和李云濤學長針對團隊開發過程中遇到的問題進行了討論&#xff0c;非常感謝學長們的熱心幫助&#xff0c;同時我們也被他們強大的編程能力所折服~ 在這里為學長們點…

MongoDB常用命令

啟動MongoDB$mongod --fork --logpath/data/log/r3.log--fork 允許mongod后臺運行&#xff0c;但是必須指定日志記錄文件路徑&#xff08;Enables a daemon mode that runs the mongos process in the background.&#xff09;--logpath 指定日志記錄文件路徑 導出Collections$…

【地理信息系統GIS】教案(七章全)第一章:地理信息系統概述

文章目錄 第一節 GIS基本概念第二節 GIS的組成第三節 GIS的功能第四節 GIS的發展第一節 GIS基本概念 1.1 GIS基本概念 1、信息 是用文字、數字、符號、語言、圖象、圖形等介質來表達事件、事物或現象等的內容、數量和特征,從而向人們(或系統)提供關于現實世界新的事實和知…

C# 讀寫ini文件 保存信息

/// <summary> /// 獲取本地信息 /// </summary> /// <returns></returns> private List<MHistoryKewWord> GetLocalHistoryKeyWords(){List<MHistoryKewWord> list new List<MHistoryKewWord>();var fs new FileStream("dat…

表達式的動態解析和計算,Flee用起來真香

前言在很多項目中經常會出現需要動態解析表達式和計算的場景&#xff0c;比如一些自動審核規則&#xff0c;或者是一些變量的值通過維護的公式在運行過程中動態算出&#xff1b;由于場景需求&#xff0c;都需要比較靈活的配置對應的表達式&#xff0c;然后希望在需要的時候能根…