Может ли django-поршневой модуль создать загрузочный образ restful webservice - PullRequest
3 голосов
/ 15 мая 2010

Я пытаюсь успокоить сервер, чтобы можно было загрузить изображение. Используя django-поршень, я могу поместить, получить, опубликовать информацию, но не знаю, как загрузить изображение.

Ответы [ 4 ]

0 голосов
/ 18 ноября 2010

Вы можете найти два ответа здесь: http://groups.google.com/group/django-piston/browse_thread/thread/6f3f964b8b3ccf72/bd1658121bb1874c?show_docid=bd1658121bb1874c&pli=1

Один из способов - использовать request.FILES, чтобы получить имя файла, а затем сохранить изображение:

def create(self, request, nickname): 
    name = request.FILES["image"].name 
    image = PIL.Image.open(request.FILES["image"]) 
    image.save(SOME_PATH+name) 
    return rc.ALL_OK 

Второе предложение - определить модель Image и форму ImageForm и использовать их:

def create(self, request, nickname):
    form = ImageForm(request.POST, request.FILES)
    if form.is_valid():
        Image.objects.create(image=form.cleaned_data['image'])
        return rc.ALL_OK
    return rc.BAD_REQUEST

ВНИМАНИЕ: я не проверял ни один из этих методов!

0 голосов
/ 07 ноября 2010

С одной стороны, да. Если у вас есть данные изображения, можно отправить их по почте обработчику, который знает, как их обрабатывать; если вы все делаете правильно, теоретически он должен быть доступен в request.FILES вашему обработчику. Простой HTTP.

С другой стороны, нет. Чтобы сделать AJAX-загрузку таким образом, вам нужно каким-то образом получить данные изображения без фактической отправки пользователем формы. Вот почему «формы загрузки ajax» так сложно реализовать, и они обычно используют такие хитрости, как скрытые фреймы для выполнения своих задач.

Насколько мне известно, только Firefox и его родственники-гекконы разрешают этот вид доступа к двоичному содержимому файлового поля через объект * File8 * get8Binary () объекта.

0 голосов
/ 07 ноября 2010

Вы, конечно, можете сделать ПОЧТУ. Файл (ы) будет доступен в запросе. ФАЙЛЫ (поршень не помешает этому).

Чтобы выполнить PUT, нам нужно будет внести некоторые изменения в поршень для поддержки заголовка x-method-override. Это то, что я делаю, чтобы позволить PUT и DEL от вспышки. (Не забудьте добавить заголовок при выполнении процедуры POST, чтобы он интерпретировался как PUT)

Вот пример промежуточного программного обеспечения:

class x_http_methodoverride_middleware():
    def process_request(self, request):
        if 'HTTP_X_HTTP_METHODOVERRIDE' in request.META:
            newMethod = request.META['HTTP_X_HTTP_METHODOVERRIDE']
            if 'PUT' == newMethod.upper():
                request.method = 'PUT'
                request.META['REQUEST_METHOD'] = 'PUT'
                request.PUT = request.POST                
            if 'DELETE' == newMethod.upper() or 'DEL' == newMethod.upper():
                request.method = 'DELETE'
                request.META['REQUEST_METHOD'] = 'DELETE'
                request.DELETE = request.POST

(код от билета с открытым поршнем здесь http://bitbucket.org/jespern/django-piston/issue/83/use-x-http-method-override-to-override-put)

0 голосов
/ 05 ноября 2010

в значительной степени.

технически это просто http-пост.

...