Джанго: Как вернуть сырой ответ - PullRequest
9 голосов
/ 31 октября 2011

Это то, что я хочу.

  1. Отправка запроса POST на внешний сайт (т. Е. Данные для входа).
  2. Получите ответ
  3. Возвращает необработанный ответ в браузер моего клиента (содержащий куки для входа в систему
    проверка).
  4. Если клиент пытается получить доступ к сайту в новой вкладке, он обнаруживает, что он уже вошел в систему.

Я успешно выполнил шаги 1 и 2 (отправил сообщение POST и получил ответ с сайта).

request = urllib2.Request(url, formData, headers)
response = urllib2.urlopen(request)

Но когда я пытаюсь вернуть его в виде

return response

Я получаю следующую ошибку

Django Version:     1.3.1
Exception Type:     AttributeError
Exception Value:    addinfourl instance has no attribute 'has_header'
Exception Location:D:\Python27\lib\site-packages\django\utils\cache.py in patch_vary_headers

примечание: У меня раньше была ошибка csrf, но я отключил csrf с помощью decorator @csrf_exempt и ошибка исчезла

Ответы [ 2 ]

7 голосов
/ 31 октября 2011

Вы не должны возвращать ответ напрямую из метода urlopen.Вместо этого ваше представление должно возвращать экземпляр django HttpResponse , где body и заголовки должны быть установлены в соответствии с исходным ответом :

from django.http import HttpResponse
import urllib2

def my_view(request):
    request = urllib2.Request(url, formData, headers)
    response = urllib2.urlopen(request)

    # set the body
    r = HttpResponse(response.read())

    # set the headers
    for header in response.info().keys():
        r[header] = response.info()[header]

    return r
0 голосов
/ 31 октября 2011

Во-первых, не имеет смысла отправлять URL-запрос в качестве ответа в представлении. Но, даже если бы ты мог, это не сделало бы то, что ты хочешь. Невозможно войти на другой сайт по понятным причинам: это будет серьезной дырой в безопасности.

...