PDF в ответ на POST - Android-браузеры выполняют дополнительный GET и сохраняют его как файл - PullRequest
0 голосов
/ 25 сентября 2010

Мое представление Django генерирует PDF через pycairo в ответ на POST (я не перенаправляю в ответ на POST). Когда я POST использую настольные браузеры, я могу сохранять и / или просматривать PDF с помощью Adobe Reader или Document Viewer. Однако, когда я отправляю POST через мои браузеры Android, Adobe PDF Reader и средства просмотра ThinkFree сообщают, что файл поврежден.

Просматривая файлы журналов на моем сервере приложений, оба браузера Android отправляют сообщение POST, за которым сразу следует GET для той же страницы:

[24/Sep/2010:22:49:20 -0500] "POST /courses/blank/create/ HTTP/1.1" 200 8895 "http://example.com/create/" "Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; SPH-D700 Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17"

[24/Sep/2010:22:49:20 -0500] "GET /courses/blank/create/ HTTP/1.1" 200 9432 "-" "Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; SPH-D700 Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17"

Когда я смотрю на файл, сохраненный в телефоне, это HTML-код запроса GET.

Вот скелет зрения:

def create(request, template="blankgrids/create.html"):
    if request.method == 'POST':
        form = BlankGridForm(request.POST)
        if form.is_valid():
            response = HttpResponse(mimetype='application/pdf')
            response['Content-Disposition'] = 'attachment; filename=example.pdf'
            # snipped pycairo code that writes directly into response
            return response
    else:
        form = BlankGridForm()

    return render_to_response(template,
                          {'form': form},
                          context_instance=RequestContext(request))

Так что мне интересно, что может быть причиной того, что браузеры Android выполняют GET?

1 Ответ

0 голосов
/ 26 сентября 2010

Я не знаю, что заставляет его делать GET, но вы не сможете изменить его поведение.Вы можете изменить свой код так, чтобы POST возвращал перенаправление в GET для PDF.Если у вас есть данные в POST, необходимые для создания PDF-файла, вы можете либо сохранить их в сеансе, либо добавить их в качестве параметров url, возможно, с маркером безопасности для предотвращения повторов и т. Д.

...