Alf*_*ang 6 python mime multipartform-data httprequest python-3.x
我目前想在Python3中使用以下代码,但发现该函数mimetools.choose_boundary已被弃用,如何更改代码并使其有效?
import re
from urllib.request import urlopen, Request
import os
import mimetypes
import mimetools
def get_content_type(filepath):
return mimetypes.guess_type(filepath)[0] or 'application/octet-stream'
def encode_multipart_formdata(fields, files=[]):
"""
fields is a sequence of (name, value) elements for regular form fields.
files is a sequence of (name, filepath) elements for data to be uploaded as files
Return (content_type, body) ready for httplib.HTTP instance
"""
BOUNDARY = mimetools.choose_boundary()
CRLF = '\r\n'
L = []
for (key, value) in fields:
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s"' % key)
L.append('')
L.append(value)
for (key, filepath) in files:
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, os.path.basename(filepath)))
L.append('Content-Type: %s' % get_content_type(filepath))
L.append('')
L.append(open(filepath, 'rb').read())
L.append('--' + BOUNDARY + '--')
L.append('')
body = CRLF.join(L)
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
return content_type, body
Run Code Online (Sandbox Code Playgroud)
Alf*_*ang 12
好吧,我回答我的问题,因为这里没有其他可用的答案.
是的,我最终得到了结果,有关我在该问题上的工作的更多信息,以下信息可能有所帮助.
boundary在做multipart/form-data要求?实际上,要分离数据的不同部分就是这样的请求,我们使用分隔符,这里我们调用boundary,来划分表单数据.
这些部分可以是字段值(纯文本),也可以是上传文件内容.
要声明请求被接受为mulitipart/form-data格式,我们首先选择一个名为的特殊字符串,boundary并将其放在请求标头中:
Content-Type: multipart/form-data; boundary=FORM-BOUNDARY
Run Code Online (Sandbox Code Playgroud)
看到我们选择边界字符串FORM-BOUNDARY,实际上我们可以选择任何我们想要的字符串.
大多数时候我们可能会选择一个长而随机的字符串来防止碰撞.
在请求主体(有效负载)中,我们将数据与boundary分隔符分开,例如:
--FORM-BOUNDARY
Content-Disposition: form-data; name="template"; filename=".xls"
Content-Type: application/vnd.ms-excel
A654ADE5^%^#%@%$@ (BINARY DATA IN THIS SECTION)
--FORM-BOUNDARY
Content-Disposition: form-data; name="username"
admin
--FORM-BOUNDARY
Content-Disposition: form-data; name="password"
admin_password
--FORM-BOUNDARY--
Run Code Online (Sandbox Code Playgroud)
看到的是,我们开始一个形部分的隔膜,用boundary单后--象征.
然后在该表单部分中,我们导出标题以声明内容类型和该发布字段的名称.
然后需要一个空白行.
然后我们导出该表单部分的值(数据).
在所有表单部分之后,我们使用分隔符结束请求主体,boundary两个--符号之间.
mimetools.choose_boundary什么呢?实际上,这个函数(自py3以来已弃用)生成一个具有指定格式的随机边界,请参阅:https://docs.python.org/2.7/library/mimetools.html?highlight = CHOSE_boundary #mimetools.choose_boundary
格式为:
'hostipaddr.uid.pid.timestamp.random'
Run Code Online (Sandbox Code Playgroud)
就这么简单.
如果我们坚持得到相同的结果,
email.generator模块的_make_boundary()功能.但实际上,要使其工作,不需要这样做,只需生成一个随机字符串来替换它!