python post content-type:multipart/form-dataタイプのフォームデータ


フォームデータpostのデフォルトはアプリケーション/x-www-form-urlencodeで、ラベルに属性enctype=multipart/form-dataを加えることができ、postのデータはmultipart/form-dataで符号化され、このフォーマットは通常ファイルアップロード、バイナリ転送に使用されますが、通常のフォームデータはmultipart/form-dataを使用することもできます.
pythonがmultipart/form-dataを処理するモジュールの1つはposterであり、一般的な使用方法は以下の通りである.
モジュール内の相関関数のインポート
from poster.encode import multipart_encode,MultipartParam
from poster.streaminghttp import register_openers
まずregister_Openers()httpストリームプロセッサをurllib 2にバインド
opener = poster.streaminghttp.register_openers()
ここで注意して、前に
#  cookie,    cookie
cj = cookielib.LWPCookieJar()
#     cookie opener,    opener.open()  URL
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#  opener,       urllib2.urlopen()  cookie
urllib2.install_opener(opener)
クッキー付きurllib 2,register_を生成Openers()はurllib 2をリフレッシュするので、クッキーのプロセッサを再バインドする必要があります(私自身の理解、間違ったところ、指摘してください)
opener.add_handler(urllib2.HTTPCookieProcessor(cj))
ファイルなしでアップロードされた純粋なフォームデータについて、nameとvalueをparamsなどのdictに構成し、次に
datagen, headers = multipart_encode(params)
datagenはジェネレータで、headersはリクエストヘッダであり、現在content-lengthとcontent-typeが携帯されている.content-typeには、postを分割するためのタイプmultipart/form-dataとランダム生成boundaryを含むデータブロックが含まれている.
さらにheadersにキー値ペア情報を追加し、リクエストオブジェクトを生成します.
req = urllib2.Request(url, datagen, headers)
リクエスト・オブジェクト・アクセスの使用
urllib2.urlopen(req)
ファイルをアップロードする場合、私はこのようにします.
datagen,headers = multipart_encode({'file':open(path,'rb')})
ここで、nameはfileであり、実際の状況に対応する.また通常のフォームパラメータやファイルがある場合は、dictに直接組み立ててmultipart_を使用することもできると思います.encode、そしてstackoverflowの上の方法はこうです
from poster.encode import multipart_encode, MultipartParam
import urllib2

def postFileRequest(url, paramName, fileObj, additionalHeaders={}, additionalParams={}):
    items = []
    #wrap post parameters
    for name, value in additionalParams.items():
        items.append(MultipartParam(name, value))
    #add file
    items.append(MultipartParam.from_file(paramName, fileObj))
    datagen, headers = multipart_encode(items)
    #add headers
    for item, value in additionalHeaders.iteritems():
        headers[item] = value
    return urllib2.Request(url, datagen, headers)
他のパラメータをMultipartParamクラスにカプセル化し、ファイルはMultipart.from_file()を追加し、encodeを行います.テストしたことがないので、参考にしてください.http://stackoverflow.com/questions/10546437/problems-using-multipart-encode-poster-library.公式文書も参照できますhttp://atlee.ca/software/poster/poster.encode.html#poster.encode.MultipartParam.