Может Cherrypy получать составные / смешанные POST-сообщения прямо из коробки?

Мы получаем некоторые POST-данные xml + произвольных двоичных файлов (например, изображений и аудио) от устройства, которое дает нам только многочастное / смешанное кодирование.

Я установил вишневый обработчик загрузки / POST для нашего получателя. Мне удалось разрешить ему делать произвольное количество параметров, используя multipart / form-data. Однако, когда мы пытаемся отправить смешанные данные, состоящие из нескольких частей, мы не получаем никакой обработки.

@cherrypy.expose
def upload(self, *args,**kwargs):
    """upload adapted from cherrypy tutorials

    We use our variation of cgi.FieldStorage to parse the MIME
    encoded HTML form data containing the file."""

    print args   
    print kwargs

    cherrypy.response.timeout = 1300

    lcHDRS = {}
    for key, val in cherrypy.request.headers.iteritems():
        lcHDRS[key.lower()] = val
    incomingBytes = int(lcHDRS['content-length'])

    print cherrypy.request.rfile 

    #etc..etc...

Итак, при отправке multipart / form-data аргументы и kwargs четко определены. args - это поля формы, kwargs = хэш переменных и значений. Когда я отправляю multipart / mixed, args и kwargs пусты, и у меня есть только cherrypy.request.rfile в качестве необработанной информации POST.

Мой вопрос: есть ли у Cherrypy встроенный обработчик для обработки multipart / смешанного и фрагментированного кодирования для POST? Или мне нужно будет переопределить cherrypy.tools.process_request_body и свернуть собственный декодер?

Похоже, что встроенный wsgi-сервер с cherrypy обрабатывает это как часть спецификации HTTP / 1.1, но мне не удалось найти документацию в cherrypy для доступа к этой функции.


... уточнить

Я использую Cherrypy последней версии 3.1.1 или около того.

Создание формы по умолчанию включает в себя создание параметров в функции загрузки.

Для multipart / form-data я вызвал curl -F [email protected] -F param2 = sometext -F [email protected] http: // пункт назначения: порт / загрузка

В этом примере я получаю:

args = ['param1','param2','param3] 
kwargs = {'param1':CString<>, 'param2': 'sometext', 'param3':CString<>}

При попытке отправить multipart / mixed я попытался посмотреть на request.body, но продолжал получать для этого None, независимо от настройки обработки тела.

Мы получаем следующие данные:

user-agent:UNTRUSTED/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1
content-language:en-US
content-length:565719
mime-version:1.0
content-type:multipart/mixed; boundary='newdivider'
host:192.168.1.1:8180
transfer-encoding:chunked



--newdivider
Content-type: text/xml

<?xml version='1.0' ?><data><Stuff>....
etc...etc...

--newdivider
Content-type: image/jpeg
Content-ID: file://localhost/root1/photos/Garden.jpg
Content-transfer-encoding: binary

<binary data>

У меня есть подозрение, что multipart / mixed - это проблема, которую cherrypy просто дает мне только rfile. Наша цель - заставить Cherrypy разделить тело на части с минимальной обработкой на принимающей стороне (т.е. позволить Cherrypy творить чудеса). Если это требует от нас более жестких подходов к формату отправки, чтобы он был типом контента, который нравится Cherrypy, то пусть будет так. Какие форматы принимаются? Это только multipart / form-data?

какая версия Cherrypy, и можете ли вы сделать образец HTML-формы?

llimllib 06.01.2009 07:00

Вместо rfile посмотрите cherrypy.request.body, если Content-Type не является данными формы.

fumanchu 06.01.2009 21:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
5 397
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Виноват. Когда Content-Type имеет тип multipart / *, CP пытается вставить содержимое в request.params (если какой-либо другой Content-Type, он переходит в request.body).

К сожалению, CP предположил, что любое составное сообщение является данными формы, и не предусмотрел другие подтипы. Я только что исправил это в багажнике, и он должен быть выпущен в версии 3.1.2. Извините за причиненные неудобства. В краткосрочной перспективе вы можете попробовать применить набор изменений локально; см. http://www.cherrypy.org/ticket/890.

Эй, спасибо, это сработало как шарм. Теперь можно с легкостью извлекать все части из cherrypy.request.params ['parts']. Спасибо!

dmyung 19.01.2009 05:41

Я ищу такой же ответ и нашел это: svn.cherrypy.org/trunk/cherrypy/_cpreqbody.py. В нем объясняется, как Cherrypy обрабатывает данные multipart post с необработанными байтами, но я еще не понял, как решить эту проблему.

Marc Maxmeister 14.03.2014 15:56

Итак, как мне сохранить этот входящий материал: [<объект cherrypy._cpreqbody.Part в 0x7fd95a409a90>, <объект cherrypy._cpreqbody.Part в 0x7fd95a178190>] на диск как локальный файл?

Marc Maxmeister 14.03.2014 15:57

Ссылка на тикет мертва, что делает этот ответ бесполезным для меня. :(

siebz0r 06.08.2018 19:01

Другие вопросы по теме