你想要的是在 wsgi环境中,特别是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)
并将两者结合...
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)