2012-08-03 28 views
4

我目前正在試圖從與bottle.py編寫的Web應用程序中的客戶端獲取信息。 Bottle.py讓我們訪問通過environ變量在WSGI規範中定義的CGI變量。但是這些規範並沒有將remote_port列爲強制變量或可選變量。REMOTE_PORT通過WSGI

@get('/echo/) 
def echo(): 
    values = {} 
    for i in request.environ: 
     values[i] = str(request.environ[i] 

    return values 

所以我想知道是否有一種方法可以訪問任何其他均值REMOTE_PORT信息:直接訪問原始套接字來檢索CLIENT_ADDRESS,通過bottle.py,或通過任何其他平均

謝謝, Gabriel

+0

客戶端遠程端口不會告訴你任何東西,並不會成爲客戶實際的端口,如果代理是連接的一部分。你能解釋你想要做什麼,也許可以建議一個更好的選擇? – 2012-08-04 00:20:21

+0

我知道它不會長期爲我提供客戶信息,但我只想了解我在哪裏可以檢索到這些信息。 然後,側面的問題仍然是如何從bottly.py – Gabriel 2012-08-04 15:07:40

+0

訪問原始套接字它仍然沒有任何意義,爲什麼你會想要實際的'端口'號碼。它將是一個隨機數,範圍由操作系統爲這些客戶端套接字分配。你能澄清一下,你真正在做的是不是REMOTE_ADDR,一些服務器已經提供了嗎?也就是IP地址。這將爲最後一跳客戶端提供IP。在此之前,您可以使用X-Forwarded-For,但使用它可能會產生問題。正如我所問,解釋你想要做什麼並澄清你的條款,因爲你強調端口這個詞很混亂。 – 2012-08-04 23:26:40

回答

0

這似乎取決於你如何爲你的應用程序提供服務。

例如,Django開發服務器(runserver)不會爲您提供遠程端口。同時,我能夠通過Apache上的應用程序檢索它,並且顯然CherryPy服務器也提供它。

奇怪的是,就像你說的那樣,它不是WSGI specification (PEP 333)的一部分。

+0

CherryPy WSGI服務器直接管理套接字連接,因此可以訪問直接套接字連接的客戶端細節。這仍然沒有幫助,但是如果它們之間存在代理或防火牆,則套接字詳細信息將是代理或防火牆的詳細信息,而不是原始客戶端。即使REMOTE_ADDR也有相同的問題。由於代理和防火牆,人們已經使用了像X-Forwarded-For這樣的事實上的標題,但它只是提供了IP。現在已經在http://tools.ietf.org/html/rfc7239 – 2014-08-27 01:33:31

+0

中正式使用這樣的頭文件了,我將再次強調,實際的端口號也是毫無意義的,因爲它是一個動態分配的值,它並不真的告訴你很多。如果有人說需要記錄它,那麼他們可能沒有意識到它是沒有價值的。 – 2014-08-27 01:34:48

+0

我想你已經提出了你的觀點,但我真的不明白你爲什麼花這麼多精力去描述這些信息是多麼的無用。問題不在於這些數據有多相關,也不是關於如何檢索請求發起者的IP和端口(這似乎打擾了你的大時間)。這只是關於*在哪裏*和*如何*讀取它。 – Anto 2014-08-27 12:45:04

1

我只是做與Apache-2.4 mod_wsgi的一個考驗,而這個簡單的WSGI腳本:

def application(environ, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    yield str(environ) 

而且,至少這個mod_wsgi的,你得到的端口environ['REMOTE_PORT']

這裏的environ全文:

{ 
    'mod_wsgi.listener_port':'80', 
    'mod_wsgi.listener_host':'', 
    'CONTEXT_DOCUMENT_ROOT':'/usr/htdocs', 
    'SERVER_SOFTWARE':'Apache', 
    'SCRIPT_NAME':'', 
    'mod_wsgi.enable_sendfile':'0', 
    'mod_wsgi.handler_script':'', 
    'SERVER_SIGNATURE':'<address>Apache Server at 127.0.0.1 Port 80</address>\n', 
    'REQUEST_METHOD':'GET', 
    'PATH_INFO':'/', 
    'SERVER_PROTOCOL':'HTTP/1.1', 
    'QUERY_STRING':'', 
    'HTTP_USER_AGENT':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/37.0.2062.58 Safari/537.36', 
    'HTTP_CONNECTION':'keep-alive', 
    'SERVER_NAME':'127.0.0.1', 
    'REMOTE_ADDR':'127.0.0.1', 
    'mod_wsgi.queue_start':'1409123400512619', 
    'mod_wsgi.request_handler':'wsgi-script', 
    'apache.version':(2, 4, 10), 
    'wsgi.url_scheme':'http', 
    'PATH_TRANSLATED':'/opt/wsgi/wsgi.py/', 
    'SERVER_PORT':'80', 
    'wsgi.multiprocess':True, 
    'mod_wsgi.input_chunked':'0', 
    'SERVER_ADDR':'127.0.0.1', 
    'DOCUMENT_ROOT':'/usr/htdocs', 
    'mod_wsgi.process_group':'wsgi_local', 
    'mod_wsgi.daemon_connects':'1', 
    'SCRIPT_FILENAME':'/opt/wsgi/wsgi.py', 
    'SERVER_ADMIN':'[no address given]', 
    'wsgi.input':<mod_wsgi.Input object at 0x7fd6fc5d24b0>, 
    'HTTP_HOST':'127.0.0.1', 
    'CONTEXT_PREFIX':'', 
    'wsgi.multithread':True, 
    'mod_wsgi.callable_object':'application', 
    'HTTP_CACHE_CONTROL':'max-age=0', 
    'mod_wsgi.daemon_restarts':'0', 
    'REQUEST_URI':'/', 
    'HTTP_ACCEPT':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'wsgi.file_wrapper':<type 'mod_wsgi.FileWrapper'>, 
    'wsgi.version':(1, 0), 
    'GATEWAY_INTERFACE':'CGI/1.1', 
    'wsgi.run_once':False, 
    'wsgi.errors':<mod_wsgi.Log object at 0x7fd6fc5e8930>, 
    'REMOTE_PORT':'32915', 
    'HTTP_ACCEPT_LANGUAGE':'fr,en-US;q=0.8,en;q=0.6', 
    'REQUEST_SCHEME':'http', 
    'mod_wsgi.version':(4,2,7), 
    'mod_wsgi.script_start':'1409123400512718', 
    'mod_wsgi.application_group':'127.0.0.1|', 
    'mod_wsgi.script_reloading':'1', 
    'mod_wsgi.request_start':'1409123400512528', 
    'HTTP_ACCEPT_ENCODING':'gzip,deflate,sdch', 
    'UNIQUE_ID':'[email protected]', 
    'mod_wsgi.daemon_start':'1409123400512693' 
}