Где mimetools.выберите граничную функцию в Python3?

в настоящее время я хочу использовать следующий фрагмент кода в 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 = 'rn' 
    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 ответов


Ну, я отвечаю на свой вопрос, так как здесь нет другого ответа.

Да, я получил результат, наконец, для получения дополнительной информации о моей работе вокруг вопроса, указанных ниже информация может помочь.


1. Что делает boundary У в multipart/form-data запрос?

на самом деле, чтобы разделить разные части данных такой запрос, мы используем разделитель, здесь мы называем boundary, чтобы разделить данные формы.

эти части могут быть значение поля (текст), или загрузка содержимого файла.

2. Сначала мы помещаем строку границы в заголовок запроса.

требовать, чтобы запрос был принят как mulitipart/form-data формат, мы сначала выбираем специальную строку, называемую boundary, и поместите его в заголовок запроса:

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

видя, что мы выбираем граничную строку FORM-BOUNDARY здесь, на самом деле мы можем выбрать любую строку, которую мы хотим.

больше всего времени мы можем выбрать длинное, случайно строка, чтобы предотвратить столкновение.

3. Используйте выбранную границу в теле запроса.

в теле запроса (полезная нагрузка), мы отделяем данные с 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. Так что делать?

фактически, эта функция (устаревшая с 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 модуль