Где 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'
просто.
если мы настаиваем на получении того же результата,
- мы можем написать функционал сами.
- или позвонить
email.generator
модуль