Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过WSGI的远程_端口_Python_Wsgi_Bottle - Fatal编程技术网

Python 通过WSGI的远程_端口

Python 通过WSGI的远程_端口,python,wsgi,bottle,Python,Wsgi,Bottle,我目前正试图在用编写的web应用程序中从客户端获取信息。py让我们通过环境变量访问规范中定义的CGI变量。但这些规范并未将远程_端口列为强制性或可选变量 @get('/echo/) def echo(): values = {} for i in request.environ: values[i] = str(request.environ[i] return values 因此,我想知道是否有一种方法可以以任何其他方式访问远程_端口信息:直接访问原

我目前正试图在用编写的web应用程序中从客户端获取信息。py让我们通过环境变量访问规范中定义的CGI变量。但这些规范并未将远程_端口列为强制性或可选变量

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

    return values
因此,我想知道是否有一种方法可以以任何其他方式访问远程_端口信息:直接访问原始套接字以检索客户机_地址,通过blank.py或任何其他方式

谢谢,
Gabriel

这似乎取决于您如何为应用程序提供服务

例如,Django开发服务器(
runserver
)不会为您提供远程端口。同时,我可以通过Apache上的一个应用程序检索到它,显然,服务器也提供了它


奇怪的是,就像你说的,它不是

我刚刚用apache-2.4 mod_wsgi和这个简单的wsgi脚本做了一个测试:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield str(environ)
而且,至少通过这个mod_wsgi,您可以在
环境['REMOTE_port']
中获得端口

以下是
环境
的全部内容:

{  
   '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':'U-2ESH8AAAEAACYQU@MAAABE',
   'mod_wsgi.daemon_start':'1409123400512693'
}
{
'mod_wsgi.listener_port':'80',
“mod_wsgi.listener_host”:“,
“上下文文档根”:“/usr/htdocs”,
“服务器软件”:“Apache”,
“脚本名称”:“,
'mod_wsgi.enable_sendfile':'0',
'mod_wsgi.handler_script':'',
“服务器签名”:“127.0.0.1端口80的Apache服务器\n”,
“请求方法”:“获取”,
“路径信息”:“/”,
“服务器协议”:“HTTP/1.1”,
“查询字符串”:“”,
“HTTP_USER_AGENT”:“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/37.0.2062.58 Safari/537.36”,
“HTTP_连接”:“保持活动状态”,
“服务器名称”:“127.0.0.1”,
“远程地址”:“127.0.0.1”,
'mod_wsgi.queue_start':'1409123400512619',
'mod_wsgi.request_handler':'wsgi-script',
'apache.version':(2,4,10),
'wsgi.url_scheme':'http',
“路径转换”:“/opt/wsgi/wsgi.py/”,
“服务器端口”:“80”,
“wsgi.multiprocess”:True,
'mod_wsgi.input_chunked':'0',
“服务器地址”:“127.0.0.1”,
“文档根”:“/usr/htdocs”,
'mod_wsgi.process_group':'wsgi_local',
'mod_wsgi.daemon_connects':'1',
'SCRIPT_FILENAME':'/opt/wsgi/wsgi.py',
“服务器\管理”:“[未提供地址]”,
“wsgi.input”:,
“HTTP_主机”:“127.0.0.1”,
“上下文前缀”:“,
'wsgi.multi-thread':True,
'mod_wsgi.callable_object':'application',
“HTTP_缓存_控件”:“max-age=0”,
'mod_wsgi.daemon_restarts':'0',
“请求URI”:“/”,
“HTTP_ACCEPT”:“text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8”,
“wsgi.file_包装器”:,
“wsgi.version”:(1,0),
“网关接口”:“CGI/1.1”,
'wsgi.run_once':False,
“wsgi.errors”:,
“远程端口”:“32915”,
‘HTTP_ACCEPT_LANGUAGE’:‘fr,en-US;q=0.8,en;q=0.6’,
“请求方案”:“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':'U-2ESH8AAAEAACYQU@MAAABE',
'mod_wsgi.daemon_start':'1409123400512693'
}

如果代理是连接的一部分,客户端远程端口不会告诉您任何信息,也不会成为客户端的实际端口。你能解释一下你想做什么,也许能建议一个更好的选择吗?我知道从长远来看,它不会给我客户信息,但我只想了解在我所处的环境下,我可以在哪里检索这些信息。然后,次要的问题仍然是如何从botly.py访问原始套接字。它仍然无法解释为什么您需要实际的“端口”号。它将是一个随机数,其范围由操作系统为此类客户端套接字分配。你能澄清一下,你真正想要的不是一些服务器已经提供的远程地址吗?也就是IP地址。这将为最后一跳客户端提供IP。在这之前,您可能可以使用X-Forwarded-For,但使用它可能会有问题。正如我所问的,解释一下你想做什么并澄清你的术语,因为你对端口这个术语的强调令人困惑。他只是问最后一个远程(源)端口在哪里。这是一个关于如何,而不是为什么的问题。在我所从事的项目中,出于法律原因,客户端的ip和端口是必需的。CherryPy WSGI服务器直接管理套接字连接,因此可以访问即时套接字连接的客户端的详细信息。但如果中间有代理或防火墙,这仍然没有帮助,因为套接字细节将是代理或防火墙的细节,而不是原始客户端的细节。即使是远程地址也有同样的问题。由于代理和防火墙的存在,人们使用了X-Forwarded-For这样的事实上的头文件,但同样,它只提供IP。这些头的使用现在已经在中正式化了,我将再次强调,实际的端口号也没有任何意义,因为它是一个动态分配的值,实际上不会告诉您太多。如果有人说需要记录它,那么他们可能没有意识到它没有任何价值。我想你已经表达了你的观点,但我真的不明白你为什么要花费这么多精力来描述这些信息是多么无用。问题不在于这段数据的相关性如何,也不在于如何检索请求发起人的ip和端口(这似乎让您非常烦恼)。如果你在StackOverflow上停留足够长的时间,你会意识到有相当一部分问题是人们在问如何解决他们认为正确的解决方案。他们从未真正提出他们试图解决的问题。当你真的设法从他们那里找出他们试图解决的问题时,很多时候你会发现他们的解决方案的想法是行动