【问题标题】:Where is mimetools.choose_boundary function in Python3?Python3 中的 mimetools.choose_boundary 函数在哪里?
【发布时间】:2015-01-21 20:06:27
【问题描述】:

我目前想在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 

【问题讨论】:

  • 似乎该功能已被删除而没有直接替换。就个人而言,我只想在您的代码中包含email.generator 模块的_make_boundary() 函数的副本。

标签: python python-3.x httprequest mime multipartform-data


【解决方案1】:

好吧,我回答我的问题,因为这里没有其他可用的答案。

是的,我终于得到了结果,有关我在这个问题上的工作的更多信息,以下信息可能会有所帮助。


1。 boundarymultipart/form-data 请求中做了什么?

其实分隔不同部分的数据就是这样一个请求,我们使用分隔符,这里我们叫boundary,来划分表单数据。

这些部分可以是字段值(纯文本),也可以是上传文件内容。

2。首先我们将边界字符串放在请求头中。

要以mulitipart/form-data 格式声明请求被接受,我们首先选择一个特殊的字符串,称为boundary,并将其放入请求标头中:

Content-Type: multipart/form-data; boundary=FORM-BOUNDARY

看到这里我们选择边界字符串为FORM-BOUNDARY,其实我们可以选择任何我们想要的字符串。

大多数时候我们可能会选择一个长的、随机的字符串来防止冲突。

3。在请求正文中使用选择的边界。

在请求体(payload)中,我们用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--

看到这一点,我们以分隔符开始一个表单部分,在单个 -- 符号之后使用 boundary

然后在该表单部分中,我们导出标题以声明该发布字段的内容类型和名称。

然后需要一个空行。

然后我们导出该表单部分的值(数据)。

在所有表单部分之后,我们以分隔符结束请求正文,boundary 位于两个 -- 符号之间。

4。那么mimetools.choose_boundary 会做什么呢?

其实这个函数(py3后弃用)生成随机边界,有指定格式,见:https://docs.python.org/2.7/library/mimetools.html?highlight=choose_boundary#mimetools.choose_boundary

格式为:

'hostipaddr.uid.pid.timestamp.random'

就这么简单。

如果我们坚持要得到同样的结果,

  1. 我们可以自己编写函数。
  2. 或者调用email.generator模块的_make_boundary()函数。

但其实要让它工作,没必要那样做,只需要生成一个随机字符串来替换它!

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多