2011-10-20 25 views
7

現在、Python Eventletライブラリ(http://eventlet.net/doc/)に基づいて基本的なディスパッチモデルサーバーを作成しています。 Eventlet(http://eventlet.net/doc/modules/wsgi.html)上のWSGIドキュメントを見てみると、eventlet.wsgi.server関数がクライアントに加えてx-forwarded-forヘッダを記録することがわかりますIPアドレス。Eventletを使用してWSGIアプリケーションからクライアントIPアドレスを取得する

ただし、これを取得する方法は、ファイルのようなオブジェクト(デフォルトはsys.stderr)を添付し、そのオブジェクトにサーバーパイプを割り当てることです。

私は、アプリケーション自体(つまり、パラメータとしてstart_responseとenvironを持つ関数)からクライアントIPを取得したいと考えています。実際、環境キーはこれには完璧です。何らかの理由でログオブジェクトのリダイレクトに頼ることなく、IPアドレスを簡単に取得する方法(environ辞書などを使用)がありますか?

答えて

14

wsgi environ、具体的にはenviron['REMOTE_ADDR']にあります。

ただし、プロキシが関係する場合は、REMOTE_ADDRがプロキシのアドレスになり、クライアントのアドレスが(おそらく)HTTP_X_FORWARDED_FORに含まれます。ここで

は( Sævarにすべてのクレジットを)ほとんどの場合、あなたが望む何をすべき機能です:

def get_client_address(environ): 
    try: 
     return environ['HTTP_X_FORWARDED_FOR'].split(',')[-1].strip() 
    except KeyError: 
     return environ['REMOTE_ADDR'] 

あなたは簡単にシンプルなWSGIを書き込むことによってWSGIの環境に含まれているかを見ることができますアプリやそれにブラウザを指し、例えば:

from eventlet import wsgi 
import eventlet 

from pprint import pformat 

def show_env(env, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['%s\r\n' % pformat(env)] 

wsgi.server(eventlet.listen(('', 8090)), show_env) 

と組み合わせた2 ...

from eventlet import wsgi 
import eventlet 

from pprint import pformat 

def get_client_address(environ): 
    try: 
     return environ['HTTP_X_FORWARDED_FOR'].split(',')[-1].strip() 
    except KeyError: 
     return environ['REMOTE_ADDR'] 

def show_env(env, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['%s\r\n\r\nClient Address: %s\r\n' % (pformat(env), get_client_address(env))] 

wsgi.server(eventlet.listen(('', 8090)), show_env) 
+1

ありがとうございました。実際、あなたの2番目のスニペットで示唆したように実際に次の動きがありました。プロキシ情報を指摘してくれてありがとう、もし私がロードバランサを前に置いていたら、これは確かにいくつかの混乱を引き起こしたでしょう。 WSGI仕様[リンク](http://www.python.org/dev/peps/pep-0333/#environ-variables)を見て、REMOTE_ADDRは必須変数ではないことがわかりました。私の混乱の源! –

+0

私はこのヘッダーに関するいくつかの文書を読んでいました。クライアントIPはX-Forwarded-Forの最初のIPになると思います。したがって、最初のリターンの最後のビットはおそらく '.split( '、')[0] .strip()'でなければなりません。リファレンス:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For –

関連する問題