首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mimetools.choose_boundary函数在Python3中在哪里?

mimetools.choose_boundary函数在Python3中在哪里?
EN

Stack Overflow用户
提问于 2014-11-24 06:48:20
回答 1查看 5.2K关注 0票数 7

我目前想在Python3中使用下面的代码,但是发现mimetools.choose_boundary函数被废弃了,如何更改代码并使其工作?

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-27 15:50:01

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

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

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

实际上,要分离数据的不同部分就是这样一个请求,我们使用一个分隔符(这里我们称之为boundary )来划分表单数据。

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

2.首先将边界字符串放入请求头中。

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

代码语言:javascript
复制
Content-Type: multipart/form-data; boundary=FORM-BOUNDARY

考虑到我们在这里选择边界字符串为FORM-BOUNDARY,实际上我们可以选择任何我们想要的字符串。

大多数时候,我们可以选择一个长的,随机的字符串,以防止碰撞。

3.使用请求体中选定的边界。

在请求体(有效载荷)中,我们使用boundary分隔符分隔数据,例如:

代码语言:javascript
复制
--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而不推荐)生成了一个随机边界,并具有指定的格式,请参阅:boundary

格式如下:

代码语言:javascript
复制
'hostipaddr.uid.pid.timestamp.random'

就这么简单。

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

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

但是实际上,要使它正常工作,不需要这样做,只需生成一个随机字符串来替换它!

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27099290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档