将requests.models.Response转换为Django HttpResponse

时间:2016-11-08 09:23:02

标签: python django python-requests response httpresponse

在我的Django项目中,我需要在视图中将一些数据发送/发布到第三方网址,然后重定向到它提供的网页。例如,我可以简单地做一些像

这样的事情
  func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == UITableViewCellEditingStyle.Delete {
    }
}

但是我想将这个第三方api用作包装的SDK,比如

class TestView(TemplateView):
    def get(self, request, *args, **kwargs):
        data = {
            'order_id': 88888,
            'subject': 'haha',
            'rn_check': 'F',
            'app_pay': 'T',
        }
        url = 'http://some-third-party-api-url?order_id=88888&subject=haha&...'
        return HttpResponseRedirect(url)

和api代码:

class TestView(TemplateView):
    def get(self, request, *args, **kwargs):
        from sucre.alipay_sdk.base import Alipay
        from sucre.alipay_sdk import alipay_config
        from django.http import HttpResponse
        alipay = Alipay(alipay_config)
        data = {
            'order_id': 88888,
            'subject': 'haha',
            'rn_check': 'F',
            'app_pay': 'T',
        }
        '''alipay api is wrapped in a sdk'''
        '''and return a requests.models.Response instance'''
        result = alipay.api('pay', data)
        return HttpResponse(result)

但似乎HttpResponse(结果)不是将requests.models.Response实例转换为HttpResponse的正确方法...布局不好,还有一些编码问题等等...是否有正确的转换方法请求回应Django HttpResponse?

更新

HttpResponse(结果)有效,但页面的某些CSS丢失了。这可能与使用请求有关。

4 个答案:

答案 0 :(得分:11)

这应该有效:

from django.http import HttpResponse
import requests

requests_response = requests.get('/some-url/')

django_response = HttpResponse(
    content=requests_response.content,
    status=requests_response.status_code,
    content_type=requests_response.headers['Content-Type']
)

return django_response

答案 1 :(得分:1)

补充 Brian Loughnane 的回答:当我尝试解决方案时:

for k, v in requests_response.headers.items():
    django_response[k] = v

我从 django 得到一个错误:AssertionError: Hop-by-hop headers not allowed

我不知道这是否是最好的解决方案,但我通过删除有问题的标题来“修复”它。

from wsgiref.util import is_hop_by_hop

for k, v in requests_response.headers.items():
    if not is_hop_by_hop(k):
        django_response[k] = v

答案 2 :(得分:0)

这可能会对您有所帮助:

requests.models.Response类,其中json()方法(根据documentation)使用json.loads()将JSON响应反序列化为Python对象。尝试打印以下内容,您可以访问您要查找的内容。

print yourResponse.json()

答案 3 :(得分:0)

要添加到paivatulio的答案中,您可以像这样转发标题:

for k, v in requests_response.headers.items():
  django_response[k] = v