私はrequests
とGoogleドライブAPIの「マルチパート」アップロードを行っています。
email.mime
のソリューションはGoogleのAPIでは動作しませんでした。multipart/form-data
ボディの実装方法を確認するには、requests
ソースコードを掘りました。
ここ
import json
from urllib3.fields import RequestField
def encode_media_related(metadata, media, media_content_type):
rf1 = RequestField(
name='placeholder',
data=json.dumps(metadata),
headers={'Content-Type': 'application/json; charset=UTF-8'},
)
rf2 = RequestField(
name='placeholder2',
data=media,
headers={'Content-Type': media_content_type},
)
return encode_multipart_related([rf1, rf2])
は次のとおりです。
from urllib3.filepost import encode_multipart_formdata, choose_boundary
def encode_multipart_related(fields, boundary=None):
if boundary is None:
boundary = choose_boundary()
body, _ = encode_multipart_formdata(fields, boundary)
content_type = str('multipart/related; boundary=%s' % boundary)
return body, content_type
は、今、私たちはGoogleの要件に合致する(body, content_type)
タプルを作成するためにencode_multipart_related()
を使用することができます。
requests
はmultipart/related
を提供するためにラップすることができurllib3.filepost.encode_multipart_formdata()
ヘルパーを使用していますencode_media_related()
を使用して、google_auth
ライブラリを使用して、helloワールドファイルをGoogleドライブにアップロードする完全な例です。
from google.oauth2 import service_account
import google.auth.transport.requests
credentials = service_account.Credentials.from_service_account_file(
PATH_TO_SERVICE_FILE,
scopes=['https://www.googleapis.com/auth/drive.file'],
)
session = google.auth.transport.requests.AuthorizedSession(credentials)
metadata = {
'mimeType': 'application/vnd.google-apps.document',
'name': 'Test Upload',
}
body, content_type = encode_media_related(
metadata,
'<html><body><p>Hello World!</body></html>',
'text/html; charset=UTF-8',
)
resp = session.post(
'https://www.googleapis.com/upload/drive/v3/files',
data=body,
params={'uploadType': 'multipart'},
headers={'Content-Type': content_type},
)
print 'Uploaded to file with id: %s' % resp.json()['id']
[python] [python-requests] + multipart'を検索した結果、これらの22の質問を確認しましたか? –
@PiotrDobrogost:これらは 'multipart/form-data'に関するもので、' requests'があなたのために処理します。これは* 'multipart/related' *です。これは' POST'の共通エンコーディングではなく、 'requests'は自動的にそれを処理しません。 –