2017-11-24 14 views
1

私はリモートデバイスからのメッセージをPOSTメッセージとして受け取るDjango Appを持っています。Djangoでは、Request.responseをDjangoのレスポンスとしてどのように再パッケージ化するのですか?

これはDjangoのフレームワークに適しています。私は汎用のViewクラス(django.views import viewから)を使い、私自身のPOST関数を定義しました。

しかし、リモートデバイスは私がDjangoで(まだ)生成できない特別な応答が必要です。したがって、私はRequestsライブラリを使用してPOSTメッセージを再作成し、製造元のクラウドサーバに送信します。

このサーバーはデータを処理し、本文内の特別なメッセージで応答します。理想的には、HTML応答メッセージ全体がリモートデバイスに戻るべきです。有効な返信がない場合は、メッセージを再送信します。どちらが迷惑でしょう!

私はグーグルでてきたが、トラブルかのどちらかに上の鮮明な画像を得ることが生じています:

(A):任意の編集をせずにRequests.responseオブジェクトに戻っジャンゴで返信します。

(b):Djangoの応答を作成して返信します。

実際、(b)のやり方は分かっているが、その仕事は分かっていると思う。可能であれば、私はむしろ(a)するだろう。

ありがとうございました!

リッチ。

+1

この特別な返信はどうやって見えますか?何か標準ですか? – Kanak

+1

Djangoから 'HttpResponse'クラスを使用したりサブクラス化したりする理由は考えられません:https://docs.djangoproject.com/en/1.11/ref/request-response/#httpresponse-objects –

+0

@ Kanak:はい、そのXML文書です。 –

答えて

0

コメントとご質問ありがとうございます!

深夜のプログラミングの危機:あなたは何かを考えすぎるかもしれないし、明らかに間違っているかもしれない。私はそんなに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オブジェクトがあります。

  1. は「reqが」私は特別な(暗号化)返事を取り戻すために、クラウドサーバまで送るPOSTです。

  2. "resp"はクラウドサーバからの返信です。本文(.content)には特別な返信が含まれています。

  3. "r"は、このボールのローリングを開始したリモートデバイスに返信する必要があるDjango HTTPレスポンスです。

データのレスポンスを簡単に入力し、ヘッダーをクラウドサーバーから返された値に設定します。

リモートデバイスが同じデータを2回POSTしないため、これはわかります!このプロセスに間違いがあった場合は、同じデータを何度も何度も再送信します。私はSocketリピータモジュールからWhile/tryループをコピーしました。 HTTPに本当に該当するかどうかは分かりません。私はライブハードウェアでこれを48時間以上テストしていますが、今までは失敗していません。リモートデバイスとクラウドサーバーに厳しい制限があることを知っている点で、タイムアウトは疑問符です。したがって、私の "リピーター"にエラーがある場合、プロセスが長時間かかると再試行ができないことがあります。現在のPOSTを破棄または放棄するほうが良いかもしれません。リモートデバイスが再試行するのを待ちます。申し訳ありませんが、大声でリファクタリング...

関連する問題