標籤: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