使用bottle進行web開發(5):Generating Content

來源:互聯網
上載者:User

標籤:from   pytho   path   imp   wrapper   als   迴文   字串   Null 字元串   

在純粹的 WSGI中,你的應用能返回的資料類型是十分有限的,你必須返回可迭代的字串,你能返回字串是因為字串是可以迭代的,但是這導致伺服器將你的內容按一字元一字元的傳送,這個時候,Unicode 字元將不允許被返回了,這是肯定不行的。

Bottle 則支援了更多的資料類型,它甚至添加了一個 Content-Length 頭資訊,並且自動編碼 Unicode 資料,下面列舉了 Bottle 應用中,你可以返回的資料類型,並且簡單的介紹了一下這些資料類型的資料都是怎麼被 Bottle 處理的:

資料類型 介紹
字典(Dictionaries) Python 內建的字典類型資料將自動被轉換為 JSON 字串,並且添加 Content-Type 為 ’application/json’ 的頭資訊返回至瀏覽器,這讓我們可以很方便的建立基於 JSON 的API
Null 字元串,False,None或者任何非真的資料 Bottle 將為這類資料建立 ContentLength 標頭檔,被設定為 0 返回至瀏覽器
Unicode 字串 Unicode 字串將自動的按 Content-Type 標頭檔中定義的編碼格式進行編碼(預設為UTF8),接著按普通的字串進行處理
位元組串(Byte strings) Bottle 返回整個字串(而不是按位元組一個一個返回),同時增加 Content-Length 標頭檔標示位元組串長度
HTTPError 與HTTPResponse 執行個體 返回這些執行個體就像拋出異常一樣,對於 HTTPError,錯誤將被與相關函數處理
檔案對象 然後具有 .read() 方法的對象都被看作檔案或者類似檔案的對象進行處理,並傳送給 WSGI 伺服器架構定義wsgi.file_wrapper 回呼函數,某一些WSGI伺服器會使用系統最佳化的請求方式(Sendfile)來傳送檔案。
迭代器與產生品 你可以在你的回呼函數使用 yield 或者 返回一個迭代器,只要yield的對象是字串,Unicode 字串,HTTPError 或者 HTTPResponse 對象就行,但是不允許使用嵌套的迭代器,需要注意的是,當 yield 的值第一次為非空是, HTTP 的狀態 和 標頭檔將被發送到 瀏覽器

如果你返回一個 str 類子類的執行個體,並且帶有 read() 方法,那它還是將按 字串進行處理,因為字串有更高一級的優先處理權。

改變預設編碼

Bottle 依照 Content-Type 標頭檔中 charset 參數來對字串進行編碼,該標頭檔預設為 text/html; charset=UTF8 ,並且可以被Response.content_type 屬性修改,或者直接被 Response.charset 屬性修改:

from bottle import response@route(‘/iso‘)def get_iso():    response.charset = ‘ISO-8859-15‘    return u‘This will be sent with ISO-8859-15 encoding.‘@route(‘/latin9‘)def get_latin():    response.content_type = ‘text/html; charset=latin9‘    return u‘ISO-8859-15 is also known as latin9.‘

由於某些罕見的原因,Python 編碼的名稱可能與 HTTP 編碼的名稱不一致,這時你需要做兩方法的工作首先設定Response.content_type 標頭檔,然後還需要設定 Response.charset 。

靜態檔案

你可以直接返迴文件,但是 Bottle 推薦使用 static_file() 方法,它會自動的猜測檔案的 mime-type,追加 Last-Modified 標頭檔,完全的自訂需要服務的檔案路徑,並且能處理錯誤(比如 404),並且它還支援 If-Modified-Since 標頭檔並且可以返回 304 Not Modified 響應,你還可以使用一個自訂的 mime-type 來重寫 mime-type 猜測的值。

from bottle import static_file@route(‘/images/:filename#.*\.png#‘)def send_image(filename):    return static_file(filename, root=‘/path/to/image/files‘, mimetype = ‘image/png‘)@route(‘/static/:filename‘)def send_static(filename):    return static_file(filename, root=‘/path/to/static/files‘)

如果你真的需要,你還可以以異常的形式拋出檔案。

強制下載

絕大多數瀏覽器在知道下載的檔案的MIME類型並且該檔案類型被綁定到某一個應用程式時(比如PDF檔案),它們都會自動的開啟該檔案,如果你不想這樣,你可以強制的要求瀏覽器進行下載。

@route(‘/download/:filename‘)def download(filename):    return static_file(filename, root=‘/path/to/static/files‘, download=filename)

使用bottle進行web開發(5):Generating Content

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.