Я пытаюсь написать код python, который может создавать множественные HTTP-запросы в клиенте, а затем соответствующим образом интерпретировать его на сервере. У меня есть, я думаю, частично удалось на стороне клиента с этим:Создайте и проанализируйте многостраничные HTTP-запросы в Python
from email.mime.multipart import MIMEMultipart, MIMEBase
import httplib
h1 = httplib.HTTPConnection('localhost:8080')
msg = MIMEMultipart()
fp = open('myfile.zip', 'rb')
base = MIMEBase("application", "octet-stream")
base.set_payload(fp.read())
msg.attach(base)
h1.request("POST", "http://localhost:8080/server", msg.as_string())
Единственная проблема состоит в том, что библиотека электронной почты также включает Content-Type и заголовки MIME-Version, и я не уверен, как они будут связаны с HTTP-заголовков, включенных HTTPLIB:
Content-Type: multipart/mixed; boundary="===============2050792481=="
MIME-Version: 1.0
--===============2050792481==
Content-Type: application/octet-stream
MIME-Version: 1.0
Это может быть причиной того, что, когда этот запрос получен мой web.py приложения, я просто получаю сообщение об ошибке. Обработчик web.py POST:
class MultipartServer:
def POST(self, collection):
print web.input()
Выдает эту ошибку:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 242, in process
return self.handle()
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 233, in handle
return self._delegate(fn, self.fvars, args)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 415, in _delegate
return handle_class(cls)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 390, in handle_class
return tocall(*args)
File "/home/richard/Development/server/webservice.py", line 31, in POST
print web.input()
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/webapi.py", line 279, in input
return storify(out, *requireds, **defaults)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 150, in storify
value = getvalue(value)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 139, in getvalue
return unicodify(x)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 130, in unicodify
if _unicode and isinstance(s, str): return safeunicode(s)
File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 326, in safeunicode
return obj.decode(encoding)
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 137-138: invalid data
Моя строка кода представлена линией ошибки примерно на половине пути вниз:
File "/home/richard/Development/server/webservice.py", line 31, in POST
print web.input()
Это поставляемая вместе , но я не уверен, куда идти отсюда. Является ли это проблемой с моим клиентским кодом или ограничением web.py (возможно, он просто не поддерживает многопроцессорные запросы)? Любые подсказки или предложения альтернативных библиотек кода были бы с благодарностью получены.
РЕДАКТИРОВАТЬ
Ошибка выше было вызвано данными не автоматически в кодировке base64. Добавление
encoders.encode_base64(base)
Получает освобождение от этой ошибки, и теперь проблема ясна. Запрос HTTP не интерпретируется правильно на сервере, предположительно потому, что библиотека электронной почты, включая то, что должно быть HTTP заголовки в теле вместо:
<Storage {'Content-Type: multipart/mixed': u'',
' boundary': u'"===============1342637378=="\n'
'MIME-Version: 1.0\n\n--===============1342637378==\n'
'Content-Type: application/octet-stream\n'
'MIME-Version: 1.0\n'
'Content-Transfer-Encoding: base64\n'
'\n0fINCs PBk1jAAAAAAAAA.... etc
Так что-то не так там.
Благодаря
Richard
Какая черта - это многопользовательский HTTP-запрос? Действительно ли эта концепция используется? – SingleNegationElimination
@TokenMacGuy - да. да. –