摘要:在的中會使用到,因為請求提交了很多類型的數(shù)據(jù),所以必須使用進行間隔,也就是所謂的時的格式。詳細的的格式在的文檔中有詳細的介紹。這里貼一張截獲的包的信息,來幫助大家理解一下這段代碼的原理。通過提交一份文件和一個名為的字符串。
?這段時間本人在學(xué)習(xí)Android Service相關(guān)的內(nèi)容,臨時需要一個可以提供文件上傳和下載功能的服務(wù)器,于是上網(wǎng)查找了一個簡單服務(wù)器的python實現(xiàn)代碼,本著溫顧一下HTTP協(xié)議的想法,于是深入研究了一下其中的代碼,發(fā)現(xiàn)大家對SimpleHTTPRequestsHandler中的self.headers.plisttext.split("=")[1]語句的含義不是很理解,于是自己查閱了一下python源碼定義和相關(guān)HTTP協(xié)議文檔,理解了這段代碼的含義。
源碼定義?我們先來看一下關(guān)于plisttext的源碼定義。
#https://svn.python.org/projects/python/branches/alpha100/Lib/mimetools.py class Message(rfc822.Message): def __init__(self, fp): .... self.typeheader = self.getheader("content-type") .... def parsetype(self): str = self.typeheader if str == None: str = "text/plain" if ";" in str: i = string.index(str, ";") self.plisttext = str[i:] str = str[:i] else: self.plisttext = "" ....
?從源碼中可以得出,plisttext與HTTP頭部content-type有關(guān),這里我們就要回想一下content-type的有關(guān)定義了。
?在w3c的文檔給出了content-type的格式定義,我們可以發(fā)現(xiàn),content-type對的值有可選的內(nèi)容,使用;隔開,所以plisttext的值就是parameter的內(nèi)容。
Content-Type := type "/" subtype *[";" parameter] type := "application" / "audio" / "image" / "message" / "multipart" / "text" / "video" / x-token x-token :=使用原理subtype := token parameter := attribute "=" value attribute := token value := token / quoted-string token := 1* tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in / "," / ";" / ":" / "" / <"> ; quoted-string, / "/" / "[" / "]" / "?" / "." ; to use within / "=" ; parameter values
?知道了plisttext代表的含義,我們再來看一下它在文件上傳過程中的作用吧。我們先來看一下它在處理文件上傳的post請求時的作用吧。
boundary = self.headers.plisttext.split("=")[1] remainbytes = int(self.headers["content-length"]) line = self.rfile.readline() remainbytes -= len(line) if not boundary in line: return (False,"Content NOT begin with boundary") line = self.rfile.readline() remainbytes -= len(line) filename = re.findall(r"Content-Disposition.*name="file"; filename="(.*)"",line) if not fn: return (False,"Can"t find out file name")
?我們都知道當通過html的form來進行文件提交時,瀏覽器會發(fā)送POST請求,并且content-type為multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka,所以,plisttext的值為boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka。boundary在HTTP的body中會使用到,因為post請求提交了很多類型的數(shù)據(jù),所以必須使用boundary進行間隔,也就是所謂的Multipart Content-Type時的body格式。詳細的body的格式在w3c的文檔中有詳細的介紹。
?這里貼一張wireShark截獲的tcp包的信息,來幫助大家理解一下這段python代碼的原理。通過form提交一份文件和一個名為other的字符串。
POST / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 269353 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: http://localhost:8080 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="file"; filename="AndroidStudy.png" Content-Type: image/png ..... //圖片內(nèi)容 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="other" ffffd ------WebKitFormBoundaryqdHXHkzdBEGWWZka--
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/37988.html
摘要:京東云是將京東云所有資源的管理能力通過的方式提供出來,供京東云用戶和合作伙伴使用。是京東云控制臺的有效補充,方便用戶更靈活的控制自己的云上資源。在開始調(diào)用京東云之前,需提前在京東云用戶中心賬戶管理下的管理頁面申請和密鑰對簡稱。 京東云OpenAPI是將京東云所有資源的管理能力通過API的方式提供出來,供京東云用戶和合作伙伴使用。OpenAPI是京東云控制臺的有效補充,方便用戶更靈活的控...
摘要:勵以最少的安裝方式進行最佳實踐。上面的例子接收了一個對象并準備將其序列化。裝飾器會通過進行轉(zhuǎn)換。從對象中提取的唯一字段是。是一個特殊的字段,它接受端點名稱并為響應(yīng)中的端點生成一個??梢圆榭错棽榭赐暾斜?。 大綱 簡介 安裝 快速入門 一個最小的 api 例子 資源豐富的路由 端點 參數(shù)解析 數(shù)據(jù)格式化 完整 TODO 應(yīng)用例子 簡介 Flask-RESTful是一個Flas...
摘要:淺述集群日常管理維護中的一些痛點較為龐大的集群規(guī)模及容器數(shù)量維護管理。同時為了便于分類管理,避免端口沖突和資源合理利用。測試環(huán)境維護管理問題。測試版是基于與的運維管理系統(tǒng)。 原文出自【聽云技術(shù)博客】:http://blog.tingyun.com/web/a...時至今日,接觸kubernetes也有一段時間了,而我們的大部分業(yè)務(wù)也已經(jīng)穩(wěn)定地運行在不同規(guī)模的kubernetes集群上,...
摘要:目標是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認的版本。不同類型的鍵值對分割符號分別是。這將會協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個命令行 HTTP 客戶端。目標是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個簡單的 http 命令,可以讓我們用簡單自然的表述發(fā)送任意 HTTP 請求,并且可以輸出帶代碼高亮的結(jié)果...
摘要:上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)部署相關(guān)庫的安裝下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)網(wǎng)頁基礎(chǔ)在寫爬蟲之前,還是需要了解一些爬蟲的基礎(chǔ)知識,如原理網(wǎng)頁的基礎(chǔ)知識爬蟲的基本原理基本原理等。由萬維網(wǎng)協(xié)會和工作小組共同合作制定的規(guī)范,目前廣泛使用的是版本。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---14、部署相關(guān)庫的安裝:Scrapyrt、Gerapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---16、Web網(wǎng)頁基礎(chǔ)...
閱讀 2510·2021-11-16 11:44
閱讀 923·2021-09-10 11:16
閱讀 2284·2019-08-30 15:54
閱讀 1200·2019-08-30 15:53
閱讀 1968·2019-08-30 13:00
閱讀 673·2019-08-29 17:07
閱讀 3571·2019-08-29 16:39
閱讀 3206·2019-08-29 13:30