我现在想在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

最佳答案

嗯,我回答我的问题,因为这里没有其他答案。
是的,我最终得到了结果,有关我在这个问题上的工作的更多信息,下面的信息可能会有所帮助。
1。boundary在请求中做什么?
事实上,分离数据的不同部分就是这样一个请求,我们使用一个分隔符,这里我们称之为“multipart/form-data”,来分割表单数据。
这些部分可以是字段值(纯文本)或上载文件内容。
2。首先,我们将边界字符串放在请求头中。
要将请求声明为接受的boundary格式,我们首先选择一个称为mulitipart/form-data的特殊字符串,并将其放入请求头:

Content-Type: multipart/form-data; boundary=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--

看到这一点,我们从一个带有分隔符的表单部件开始,在一个符号后加上FORM-BOUNDARY
然后,在该表单部分中,我们导出标题以声明内容类型和已发布字段的名称。
然后需要一个空白行。
然后我们导出该组成部分的值(数据)。
在所有表单部分之后,我们用一个分隔符结束请求主体,两个符号之间有一个“boundary”。
4。那么,boundary该怎么做?
实际上,此函数(自py3以来已弃用)使用指定格式生成随机边界,请参见:https://docs.python.org/2.7/library/mimetools.html?highlight=choose_boundary#mimetools.choose_boundary
格式为:
'hostipaddr.uid.pid.timestamp.random'

就这么简单。
如果我们坚持得到同样的结果,
我们可以自己写函数。
或者调用--模块的boundary函数。
但事实上,为了让它工作,不需要这样做,只需要生成一个随机字符串来替换它!

07-27 22:01