我有一个Django应用程序,接受来自远程设备的消息作为POST消息。
这非常适合Django的框架!我使用了通用的View类(来自django.views import View),并定义了我自己的POST函数。
但是远程设备需要一个我在Django中还不能生成的特殊回复。因此,我使用请求库重新创建POST消息,并将其发送到制造商的云服务器。
该服务器处理数据,并在正文中使用特殊消息进行响应。理想情况下,整个HTML响应消息应该返回到远程设备。如果它没有得到有效的回复,它将重新发送该消息。这会很烦人的!
我一直在谷歌上搜索,但我很难弄清楚如何做到这两点:
(a):使用Requests.response对象在Django中回复,不做任何编辑。
(b):构建Django响应并将其发回。
实际上,我想我确实知道怎么做(b),但它是有效的。如果可能的话,我宁愿做(a)。
提前感谢!
里奇。
发布于 2017-11-25 14:40:19
感谢您的评论和问题!
深夜编程的危险:你可能会想得太多,或者错过了显而易见的东西。我如此专注于寻找一种方法来返回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“允许用户使用"prepped”和" send ",这允许用户在请求对象被发送之前摆弄它,并重试发送。我认为至少可以在重构中删除其中的一些;使这个过程变得更加简单。
这里有3个HTTP对象在起作用:
用数据填充响应,并将头设置为云服务器返回的值,这非常简单。
我知道这是可行的,因为远程设备不会将相同的数据发送两次!如果此过程中的任何地方出现错误,它将一遍又一遍地重新发送相同的数据。我从一个套接字中继器模块复制了While/try循环。我不知道这是否真的适用于HTTP。我已经在现场硬件上测试了超过48小时,到目前为止还没有失败过。超时也是一个问号,因为我知道远程设备和云服务器有严格的限制。因此,如果我的“中继器”中有错误,如果过程花费太长时间,重试可能不起作用。放弃/放弃当前帖子可能会更好。并等待远程设备重试。抱歉,正在大声重构...
https://stackoverflow.com/questions/47465070
复制相似问题