你想要的是在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 ENVIRON应用程序,并指着它的浏览器,例如:
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)
并结合两...
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)
感谢马蒂,事实上,我的下一步行动就是像你在第二段中所建议的那样。还要感谢指出代理信息,如果我在前面放置负载平衡器,这肯定会造成一些混淆。 查看了WSGI规范[链接](http://www.python.org/dev/peps/pep-0333/#environ-variables),我看到REMOTE_ADDR不是必需的变量,可能是我的困惑之源! –
我正在阅读关于此头文件的一些文档,在我看来,客户端IP将成为X-Forwarded-For中的第一个IP。因此,第一次返回的最后一位应该是'.split(',')[0] .strip()'。参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For –