2011-03-07 7 views
2

私のクライアント/サーバアプリケーションは、主にAjaxのような方法でクライアントと通信する特別な目的のhttpサーバに基づいています。クライアントGUIは、非同期http要求/応答サイクルでリフレッシュされます。リバースプロキシとしてDjango

特殊なhttpサーバの進化は制限されており、アプリケーションが成長するにつれて、例えばジャンゴが提供する標準的な機能がますます必要になります。

したがって、非標準専用サーバーを隠してDjangoから得ることができるように、Djangoアプリケーションをファサード/リバースプロキシとして追加したいと思います。私はゲートウェイとしてDjangoアプリを持っていて、セキュリティ上の理由や複雑さを隠すためにhttp-redirectを使用したくないです。

しかし、懸念されているのは、セグラーでDjangoを介してトラフィックをトンネリングすると、パフォーマンスが低下する可能性があるということです。これは有効な懸念事項ですか?

問題の代替方法がありますか?

答えて

2

私は先に進み、簡単なプロトタイプを作成しました。比較的シンプルで、リダイレクトしたいすべてのURLをマップするビューを設定するだけでした。

def redirect(request): 
    url = "http://%s%s" % (server, request.path) 
    # add get parameters 
    if request.GET: 
     url += '?' + urlencode(request.GET) 

    # add headers of the incoming request 
    # see https://docs.djangoproject.com/en/1.7/ref/request-response/#django.http.HttpRequest.META for details about the request.META dict 
    def convert(s): 
     s = s.replace('HTTP_','',1) 
     s = s.replace('_','-') 
     return s 

    request_headers = dict((convert(k),v) for k,v in request.META.iteritems() if k.startswith('HTTP_')) 
    # add content-type and and content-length 
    request_headers['CONTENT-TYPE'] = request.META.get('CONTENT_TYPE', '') 
    request_headers['CONTENT-LENGTH'] = request.META.get('CONTENT_LENGTH', '') 

    # get original request payload 
    if request.method == "GET": 
     data = None 
    else: 
     data = request.raw_post_data 

    downstream_request = urllib2.Request(url, data, headers=request_headers) 
    page = urllib2.urlopen(downstream_request) 
    response = django.http.HttpResponse(page) 
    return response 

だから、実際には非常に簡単で、リダイレクトが同じホスト上のループバックインターフェイスになった場合、性能は特に、十分です:ビュー機能は次のようになります。

+0

コードレットでは、ヘッダーは送信されません。受信したリクエストをそのまま渡す簡単な方法があります。私は似たようなことをしていて、apss o-authヘッダーにしたい。しかし、すべてのヘッダーを渡すクリーンなソリューションが必要です(将来のプルーフィング用に)。だから本質的に私はリバースプロキシを書いて、特別な目的のURLにリダイレクトし、私のdjangoアプリケーションから残りを提供したい。 – pranshus

+1

HTTPヘッダーのパススルーを含めるようにサンプルコードを更新しました。元のリクエストヘッダーの一部をポップしたり変更したりする必要があります。 'HOST'、 'C​​ONNECTION'。 – Bernhard

2

通常、本番環境では、Apache httpdやnginxのようなWebコンテナの後ろにDjangoをホストしています。これらのモジュールにはプロキシリクエスト用に設計されたモジュールがあります(例:locationの場合はproxy_pass)。必要に応じてキャッシングのようなボックスからいくつかのエキストラを提供します。 Djangoアプリケーションのリクエストパイプラインによるプロキシ処理と比較すると、これにより開発時間を節約しながらパフォーマンスを向上させることができます。ただし、このようなソリューションを使用するときは、要求またはプロキシされた応答を完全に操作するために電源を犠牲にします。

./manage.py runserverでローカルテストを行う場合は、if settings.DEBUG: ...セクションにurls.pyというURLパターンを追加します。以下は、リクエストを使用してGET、PUT、POSTをサポートするビュー関数コードです。 Pythonライブラリ:https://gist.github.com/JustinTArthur/5710254

+1

私はセットアップしたいとは思っていませんでしたし、nginxサーバーだけでそれを行う。しかし、私は生産でそれを得た。私はproxy_passの振る舞いを反映させたい。だから、私はあなたのビューで[この](https://gist.github.com/pbassut/c0906f95f6d0720be4d8)非常に単純なミドルウェアであなたのスクリプトを使用しました。ありがとう –

関連する問題