【问题标题】:convert requests.models.Response to Django HttpResponse将 requests.models.Response 转换为 Django HttpResponse
【发布时间】:2016-11-08 09:23:02
【问题描述】:

在我的 Django 项目中,我需要在我的视图中获取/发布一些数据到第三方 url,并重定向到它提供的网页。例如,我可以简单地做类似

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 用作包装的 SDK,例如

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)

和api代码:

def api(self, service, data):
    ''' some logics here '''
    import requests
    response = requests.get(url, data=data)
    return response

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


更新:

HttpResponse(result) 工作,但页面的一些 css 丢失了。这可能与使用请求有关。

【问题讨论】:

  • 请看mcve
  • 感谢@Olian04 的建议。 (因为这是我第一次使用 stackoverflow 来提问)但是完成的代码太长了,而且与问题本身无关——从请求响应到 HttpResponse 的转换..

标签: python django python-requests response httpresponse


【解决方案1】:

这应该可行:

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

【讨论】:

  • 为我工作。谢谢!
【解决方案2】:

补充 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

【讨论】:

    【解决方案3】:

    这可能对你有帮助:

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

    print yourResponse.json()
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2015-03-01
        相关资源
        最近更新 更多