コメントとご質問ありがとうございます!
深夜のプログラミングの危機:あなたは何かを考えすぎるかもしれないし、明らかに間違っているかもしれない。私はそんなにrequest.responseを変更/編集せずに返す方法を見つけることに集中していましたが、私はオプション(b)がどんなものかを描写しませんでした。
まあ、それはその非常に単純判明:その送られた前にリクエストオブジェクトとサルに1を可能にする「s」は1が「準備さ」と「送信」を使用することができます
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
セッションを、センドを再試行することができます。私はそれの少なくともいくつかはリファクタリングで削除できると思う。このプロセスをさらに簡単にします。
ここで遊んで3 HTTPオブジェクトがあります。
は「reqが」私は特別な(暗号化)返事を取り戻すために、クラウドサーバまで送るPOSTです。
"resp"はクラウドサーバからの返信です。本文(.content)には特別な返信が含まれています。
"r"は、このボールのローリングを開始したリモートデバイスに返信する必要があるDjango HTTPレスポンスです。
データのレスポンスを簡単に入力し、ヘッダーをクラウドサーバーから返された値に設定します。
リモートデバイスが同じデータを2回POSTしないため、これはわかります!このプロセスに間違いがあった場合は、同じデータを何度も何度も再送信します。私はSocketリピータモジュールからWhile/tryループをコピーしました。 HTTPに本当に該当するかどうかは分かりません。私はライブハードウェアでこれを48時間以上テストしていますが、今までは失敗していません。リモートデバイスとクラウドサーバーに厳しい制限があることを知っている点で、タイムアウトは疑問符です。したがって、私の "リピーター"にエラーがある場合、プロセスが長時間かかると再試行ができないことがあります。現在のPOSTを破棄または放棄するほうが良いかもしれません。リモートデバイスが再試行するのを待ちます。申し訳ありませんが、大声でリファクタリング...
この特別な返信はどうやって見えますか?何か標準ですか? – Kanak
Djangoから 'HttpResponse'クラスを使用したりサブクラス化したりする理由は考えられません:https://docs.djangoproject.com/en/1.11/ref/request-response/#httpresponse-objects –
@ Kanak:はい、そのXML文書です。 –