国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python中的plisttext和HTTP的Content-Type

Galence / 1221人閱讀

摘要:在的中會(huì)使用到,因?yàn)檎?qǐng)求提交了很多類型的數(shù)據(jù),所以必須使用進(jìn)行間隔,也就是所謂的時(shí)的格式。詳細(xì)的的格式在的文檔中有詳細(xì)的介紹。這里貼一張截獲的包的信息,來(lái)幫助大家理解一下這段代碼的原理。通過(guò)提交一份文件和一個(gè)名為的字符串。

?這段時(shí)間本人在學(xué)習(xí)Android Service相關(guān)的內(nèi)容,臨時(shí)需要一個(gè)可以提供文件上傳和下載功能的服務(wù)器,于是上網(wǎng)查找了一個(gè)簡(jiǎn)單服務(wù)器的python實(shí)現(xiàn)代碼,本著溫顧一下HTTP協(xié)議的想法,于是深入研究了一下其中的代碼,發(fā)現(xiàn)大家對(duì)SimpleHTTPRequestsHandler中的self.headers.plisttext.split("=")[1]語(yǔ)句的含義不是很理解,于是自己查閱了一下python源碼定義和相關(guān)HTTP協(xié)議文檔,理解了這段代碼的含義。

源碼定義

?我們先來(lái)看一下關(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對(duì)的值有可選的內(nèi)容,使用隔開(kā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代表的含義,我們?cè)賮?lái)看一下它在文件上傳過(guò)程中的作用吧。我們先來(lái)看一下它在處理文件上傳的post請(qǐng)求時(shí)的作用吧。

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")

?我們都知道當(dāng)通過(guò)htmlform來(lái)進(jìn)行文件提交時(shí),瀏覽器會(huì)發(fā)送POST請(qǐng)求,并且content-type為multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka,所以,plisttext的值為boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZkaboundaryHTTP的body中會(huì)使用到,因?yàn)閜ost請(qǐng)求提交了很多類型的數(shù)據(jù),所以必須使用boundary進(jìn)行間隔,也就是所謂的Multipart Content-Type時(shí)的body格式。詳細(xì)的body的格式在w3c的文檔中有詳細(xì)的介紹。

?這里貼一張wireShark截獲的tcp包的信息,來(lái)幫助大家理解一下這段python代碼的原理。通過(guò)form提交一份文件和一個(gè)名為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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37988.html

相關(guān)文章

  • 京東云 OpenAPI 簽名機(jī)制 Python 實(shí)現(xiàn)

    摘要:京東云是將京東云所有資源的管理能力通過(guò)的方式提供出來(lái),供京東云用戶和合作伙伴使用。是京東云控制臺(tái)的有效補(bǔ)充,方便用戶更靈活的控制自己的云上資源。在開(kāi)始調(diào)用京東云之前,需提前在京東云用戶中心賬戶管理下的管理頁(yè)面申請(qǐng)和密鑰對(duì)簡(jiǎn)稱。 京東云OpenAPI是將京東云所有資源的管理能力通過(guò)API的方式提供出來(lái),供京東云用戶和合作伙伴使用。OpenAPI是京東云控制臺(tái)的有效補(bǔ)充,方便用戶更靈活的控...

    khs1994 評(píng)論0 收藏0
  • Flask 擴(kuò)展系列之 Flask-RESTful

    摘要:勵(lì)以最少的安裝方式進(jìn)行最佳實(shí)踐。上面的例子接收了一個(gè)對(duì)象并準(zhǔn)備將其序列化。裝飾器會(huì)通過(guò)進(jìn)行轉(zhuǎn)換。從對(duì)象中提取的唯一字段是。是一個(gè)特殊的字段,它接受端點(diǎn)名稱并為響應(yīng)中的端點(diǎn)生成一個(gè)。可以查看項(xiàng)查看完整列表。 大綱 簡(jiǎn)介 安裝 快速入門 一個(gè)最小的 api 例子 資源豐富的路由 端點(diǎn) 參數(shù)解析 數(shù)據(jù)格式化 完整 TODO 應(yīng)用例子 簡(jiǎn)介 Flask-RESTful是一個(gè)Flas...

    阿羅 評(píng)論0 收藏0
  • 基于Python+DjangoKubernetes集群管理平臺(tái)

    摘要:淺述集群日常管理維護(hù)中的一些痛點(diǎn)較為龐大的集群規(guī)模及容器數(shù)量維護(hù)管理。同時(shí)為了便于分類管理,避免端口沖突和資源合理利用。測(cè)試環(huán)境維護(hù)管理問(wèn)題。測(cè)試版是基于與的運(yùn)維管理系統(tǒng)。 原文出自【聽(tīng)云技術(shù)博客】:http://blog.tingyun.com/web/a...時(shí)至今日,接觸kubernetes也有一段時(shí)間了,而我們的大部分業(yè)務(wù)也已經(jīng)穩(wěn)定地運(yùn)行在不同規(guī)模的kubernetes集群上,...

    animabear 評(píng)論0 收藏0
  • HTTPie 官方文檔中文翻譯版

    摘要:目標(biāo)是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認(rèn)的版本。不同類型的鍵值對(duì)分割符號(hào)分別是。這將會(huì)協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個(gè)命令行 HTTP 客戶端。目標(biāo)是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個(gè)簡(jiǎn)單的 http 命令,可以讓我們用簡(jiǎn)單自然的表述發(fā)送任意 HTTP 請(qǐng)求,并且可以輸出帶代碼高亮的結(jié)果...

    Baaaan 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---15、爬蟲(chóng)基礎(chǔ):HTTP基本原理

    摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)部署相關(guān)庫(kù)的安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)網(wǎng)頁(yè)基礎(chǔ)在寫(xiě)爬蟲(chóng)之前,還是需要了解一些爬蟲(chóng)的基礎(chǔ)知識(shí),如原理網(wǎng)頁(yè)的基礎(chǔ)知識(shí)爬蟲(chóng)的基本原理基本原理等。由萬(wàn)維網(wǎng)協(xié)會(huì)和工作小組共同合作制定的規(guī)范,目前廣泛使用的是版本。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---14、部署相關(guān)庫(kù)的安裝:Scrapyrt、Gerapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---16、Web網(wǎng)頁(yè)基礎(chǔ)...

    codeGoogle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<