在我的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丢失了。这可能与使用请求有关。
答案 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