在Django中,如何将Request.response重新打包为Django响应?

时间:2017-11-24 01:04:54

标签: python django python-2.7 django-views python-requests

我有一个Django应用程序,它接收来自远程设备的消息作为POST消息。

这非常适合Django的框架!我使用了通用的View类(来自django.views导入视图)并定义了我自己的POST函数。

但是远程设备需要一个我在Django中无法生成的特殊回复。因此,我使用Requests库重新创建POST消息并将其发送到制造商的云服务器。

该服务器处理数据,并使用正文中的特殊消息进行响应。理想情况下,整个HTML响应消息应该返回到远程设备。如果没有得到有效回复,它将重新发送消息。这会很烦人!

我一直在谷歌搜索,但我无法清楚了解如何:

(a):使用Requests.response对象回复Django,不做任何修改。

(b):构建Django响应并将其发回。

实际上,我认为我确实知道如何做(b),但它的工作。我宁愿做(a)如果可能的话。

提前致谢!

1 个答案:

答案 0 :(得分:1)

感谢您的评论和问题!

深夜编程的危险:你可能过度思考某些东西,或者错过了明显的东西。我非常专注于找到一种方法来返回request.response而没有任何更改/编辑我甚至没有勾画出选项(b)会是什么。

嗯,结果很简单:

s = Session()
# Populate POST to cloud with data from remote device request:
req = Request('POST', url, data=data, headers=headers)
prepped = req.prepare()
timeout = 10
retries = 3
while retries > 0:
  try:
    logger.debug("POST data to remote host")
    resp = s.send(prepped, timeout=timeout)
    break
  except:
    logger.debug("remote host connection failed, retry")
    retries -= 1
    logger.debug("retries left: %d", retries)
    time.sleep(.3)
    if retries == 0:
      pass # There isn't anything I can do if this fails repeatedly...
# Build reply to remote device:
r = HttpResponse(resp.content, 
                 content_type = resp.headers['Content-Type'], 
                 status = resp.status_code, 
                 reason = resp.reason, 
                 )
r['Server'] = resp.headers['Server']
r['Connection'] = resp.headers['Connection']
logger.debug("Returning Server response to remote device")
return r

会话“s”允许用户使用“准备好”和“发送”,这允许在发送之前使用请求对象,并重新尝试发送。我认为至少有一些可以在重构中删除;使这个过程更简单。

这里有3个HTTP对象:

  1. “req”是我发送到云端服务器以获取特殊(加密)回复的POST。

  2. “resp”是云服务器的回复。正文(.content)包含特殊回复。

  3. “r”是我需要发送回远程设备的Django HTTP响应,通过将数据发布到我的视图来启动这个滚动。

  4. 使用数据填充响应非常简单,并将标头设置为云服务器返回的值。

    我知道这很有效,因为远程设备没有两次POST相同的数据!如果在此过程中任何地方出现错误,它将一遍又一遍地重新发送相同的数据。我从Socket转发器模块复制了While / try循环。我不知道这是否真的适用于HTTP。我已经在实时硬件上测试了这个超过48小时,到目前为止它从未失败过。超时也是一个问号,因为我知道远程设备和云服务器有严格的限制。因此,如果我的“转发器”中存在错误,则如果该过程耗时太长,则重试可能不起作用。最好放弃/放弃当前的POST。并等待远程设备重试。对不起,大声重构...