Отправка файла через POST, объект запроса Django / python не сохраняется правильно

Я использую простой клиент REST для тестирования. Отправляя простой JPEG, попробовал следующие типы контента: Content-Type: image / jpeg Content-Type: multipart / form-data

Также обратите внимание, что аутентификация csrftoken отключена, чтобы разрешить стороннее REST-соединение.

(изображение прикрепляется через остальной клиент) Проверил wirehark и пакет настроен согласно указанному выше параметру.

Django - объект запроса имеет несколько переменных: request.body request.FILES

После получения POST сервером Django объект запроса всегда сохраняет все данные / полезную нагрузку в request.body. Разве изображение или какие-либо прикрепленные файлы не должны попадать в request.FILES? Есть ли что-то неправильно настроенное в типе содержимого или POST.

очень простой код. Просто пытаюсь распечатать в журнале. Все объекты в посте продолжают переходить на request.body

def testPost(request):
     print request.body
     print request.FILES
     return HttpResponse()

Пакет Wireshark:

Hypertext Transfer Protocol
POST /testPost/ HTTP/1.1\r\n
Host: MYURL.com:8000\r\n
Connection: keep-alive\r\n
Content-Length: 8318\r\n
Origin: chrome-extension://aejoelaoggembcahagimdiliamlcdmfm\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\n
Content-Type: image/jpeg\r\n
Accept: */*\r\n
Accept-Encoding: gzip,deflate,sdch\r\n
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4\r\n
Cookie: ******; csrftoken=**********\r\n
\r\n
[Full request URI: http://MYURL.com:8000/testPost/]
[HTTP request 1/1]

Формат обмена файлами JPEG


person Darthyogurt    schedule 04.01.2014    source источник
comment
Пожалуйста, покажите нам свой код, чтобы помочь вам :)   -  person Victor Castillo Torres    schedule 05.01.2014
comment
@VictorCastilloTorres Добавил еще. Спасибо! Что еще я должен показать?   -  person Darthyogurt    schedule 05.01.2014
comment
Настроены ли ваши URL-адреса?   -  person czarchaic    schedule 05.01.2014
comment
Да не беспокойтесь об этом ... просто замаскируйте его, чтобы люди не видели общедоступный DNS. все остальное прямо из упаковки. @czarchaic   -  person Darthyogurt    schedule 06.01.2014


Ответы (1)


Вот как я обрабатываю загрузку файлов: в данном случае это изображения. Одной из проблем, с которой я боролся некоторое время, был этот запрос. ФАЙЛЫ могли входить с несколькими ключами, и я всегда хотел последний.

Примечание: request.FILES будет содержать данные, только если:

  1. запрос - это POST
  2. запрос имеет атрибут 'enctype = "multipart / form-data"'

дополнительные сведения см. в документации по Django File-uploads.

Модель: сначала есть модель с ImageField в ней: models.py

photos_dir = settings.MEDIA_ROOT + "/photos" + "/%Y/%m/%d/"

class Photo(models.Model):
   image    = models.ImageField(upload_to=photos_dir, null=True, blank=True, default=None)
   filename = models.CharField(max_length=60, blank=True, null=True)

The View: в views.py обрабатывает сообщение:

from django.core.files.images import ImageFile

def upload_image( request ):

   file_key=None
   for file_key in sorted(request.FILES):
      pass

   wrapped_file = ImageFile(request.FILES[file_key])
   filename = wrapped_file.name

   # new photo table-row 
   photo = Photo()
   photo.filename = filename
   photo.image = request.FILES[file_key]

   try:
      photo.save()
   except OSError:
      print "Deal with this situation"

   # do your stuff here.
   return HttpResponse("boo", "text/html");

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

Ссылка: я действительно использовал эту библиотеку: poster.encode, чтобы «стимулировать данные» в моем django view.py

from poster.streaminghttp import register_openers
from poster.encode import multipart_encode
import urllib2

server = "http://localhost/"
headers = {}

# Register the streaming http handlers with urllib2
register_openers()

img="path/to/image/image.png"

data = {'media' : open( img ),
        'additionalattr': 111,
}
datagen, headers = multipart_encode(data)

headers['Connection']='keep-alive'
request = urllib2.Request('%s/upload_image/' % ( server ), datagen, headers)

print urllib2.urlopen(request).read() 
person Jeff Sheffield    schedule 05.01.2014
comment
К сожалению, я пытался использовать ваш автономный плакат для отправки запроса, но, похоже, это какая-то проблема с сокетом? Я получаю его на своем локальном и рабочем сервере. Я предполагаю, что полезная нагрузка, а также заголовок должны быть многокомпонентными? Есть ли другой способ получить изображение чисто, кроме request.FILES? Спасибо за вашу помощь @ Джефф Шеффилд - person Darthyogurt; 06.01.2014
comment
Я последовал вашему примеру кодирования из python и реализовал на Java / Google Glass, он работает! Благодарность! - person Darthyogurt; 06.01.2014
comment
И последний вопрос: когда вы отправляете зашифрованный файл, сохраняется ли он в request.body, а также в request.FILES? - person Darthyogurt; 06.01.2014
comment
если вы имеете в виду включение серверного протокола https. Тогда да, он также сохраняется в request.FILES. Ваш код просмотра сервера django будет идентичным. Ваш клиентский код должен будет иметь дело с согласованием протокола https. - person Jeff Sheffield; 06.01.2014