首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将requests.models.Response转换为Django HttpResponse

将requests.models.Response转换为Django HttpResponse
EN

Stack Overflow用户
提问于 2016-11-08 09:23:02
回答 5查看 6.7K关注 0票数 12

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

代码语言:javascript
复制
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,如

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
def api(self, service, data):
    ''' some logics here '''
    import requests
    response = requests.get(url, data=data)
    return response

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

更新:

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-09 21:35:42

这应该是可行的:

代码语言:javascript
复制
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
票数 26
EN

Stack Overflow用户

发布于 2021-03-24 22:56:38

补充一下的答案:当我尝试解决方案时:

代码语言:javascript
复制
for k, v in requests_response.headers.items():
    django_response[k] = v

我从django获得了一个错误: AssertionError:逐跳头不允许

我不知道这是否是最好的解决方案,但我“修正”了它通过删除违规的标题。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-11-08 09:51:36

这可能对你有帮助:

requests.models.Response类,它有json()方法(根据文档),它使用json.loads()将JSON响应反序列化为json.loads对象。尝试打印跟随,你可以访问任何你想要的东西。

代码语言:javascript
复制
print yourResponse.json()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40483149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档