将 requests.models.Response 转换为 Django HttpResponse
convert requests.models.Response to Django HttpResponse
在我的Django项目中,我需要get/post一些数据到第三方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 页面丢失。这可能与使用请求有关。
这可能对您有帮助:
requests.models.Response
class 其中有 json() 方法(根据 documentation)将 JSON 响应反序列化为 Python 对象使用 json.loads()。尝试打印以下内容,您可以访问您要查找的任何内容。
print yourResponse.json()
这应该有效:
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
要添加到 paivatulio 的回答中,您可以像这样转发 headers:
for k, v in requests_response.headers.items():
django_response[k] = v
添加到 Brian Loughnane 的回答:当我尝试解决方案时:
for k, v in requests_response.headers.items():
django_response[k] = v
我从 django 收到一个错误:AssertionError: Hop-by-hop headers 不允许
我不知道这是否是最佳解决方案,但我通过删除违规 headers.
来“修复”它
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
在我的Django项目中,我需要get/post一些数据到第三方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 页面丢失。这可能与使用请求有关。
这可能对您有帮助:
requests.models.Response
class 其中有 json() 方法(根据 documentation)将 JSON 响应反序列化为 Python 对象使用 json.loads()。尝试打印以下内容,您可以访问您要查找的任何内容。
print yourResponse.json()
这应该有效:
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
要添加到 paivatulio 的回答中,您可以像这样转发 headers:
for k, v in requests_response.headers.items():
django_response[k] = v
添加到 Brian Loughnane 的回答:当我尝试解决方案时:
for k, v in requests_response.headers.items():
django_response[k] = v
我从 django 收到一个错误:AssertionError: Hop-by-hop headers 不允许
我不知道这是否是最佳解决方案,但我通过删除违规 headers.
来“修复”它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