【问题标题】:REMOTE_PORT through WSGIREMOTE_PORT 通过 WSGI
【发布时间】:2012-08-01 15:41:27
【问题描述】:

我目前正在尝试在使用bottle.py 编写的 Web 应用程序中从客户端获取信息。 Bottle.py 让我们通过 environ 变量访问 CGI 变量,如 WSGI 规范中所定义。但这些规范并未将 remote_port 列为强制变量或可选变量。

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

    return values

所以我想知道是否有办法以任何其他方式访问 remote_port 信息:直接访问原始套接字以检索 client_address,通过bottle.py,或通过任何其他方式

谢谢, 加布里埃尔

【问题讨论】:

  • 客户端远程端口不会告诉你任何事情,如果代理是连接的一部分,也不会成为客户端的实际端口。您能解释一下您正在尝试做什么,或许可以提出更好的选择吗?
  • 我知道从长远来看它不会为我提供客户信息,但我只是想了解在我所拥有的环境下我可以在哪里检索这些信息。然后,附带的问题仍然是我如何从 bottly.py 访问原始套接字
  • 为什么您想要实际的“端口”号仍然没有意义。它将是一个随机数,其范围由操作系统为此类客户端套接字分配。你能澄清一下你真正想要的不是REMOTE_ADDR,一些服务器已经提供了吗?也就是IP地址。这将为最后一跳客户端提供 IP。在此之前,您可能可以使用 X-Forwarded-For,但使用它可能会出现问题。正如我所要求的,请解释您要做什么并澄清您的条款,因为您对端口一词的强调令人困惑。
  • 他只是问在哪里(如果)可以找到最后一个远程(源)端口。这是一个关于如何,而不是为什么,imo的问题。在我正在进行的项目中,出于法律原因,需要客户端的 ip 和端口。

标签: python wsgi bottle


【解决方案1】:

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

例如,Django 开发服务器 (runserver) 不会为您提供远程端口。同时,我能够使用在 Apache 和 mod_wsgi 上提供的应用程序来检索它,显然,CherryPy 服务器也提供了它。

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

【讨论】:

  • CherryPy WSGI 服务器直接管理套接字连接,因此可以访问即时套接字连接的客户端的详细信息。如果中间有代理或防火墙,这仍然无济于事,因为套接字详细信息将是代理或防火墙的详细信息,而不是原始客户端的详细信息。甚至 REMOTE_ADDR 也有同样的问题。由于代理和防火墙,人们使用了 X-Forwarded-For 等事实上的标头,但同样,它只提供 IP。此类标头的使用现已在 tools.ietf.org/html/rfc7239 中正式确定
  • 我要再次强调,实际的端口号无论如何也毫无意义,因为它是一个动态分配的值,并不能真正告诉你太多。如果有人说需要记录它,那么他们可能没有意识到它没有价值。
  • 我想你已经表达了你的观点,但我真的不明白你为什么要花这么多精力来描述这些信息是多么无用。问题不在于这条数据的相关性与否,也不在于如何检索请求发起者的 ip 和端口(这似乎很困扰你)。它只是关于在哪里如何阅读它。
  • 如果您在 StackOverflow 上闲逛的时间足够长,您就会意识到,有不少问题是人们询问如何解决他们认为正确的解决方案。他们从未真正提出他们试图解决的问题。当你真正设法从他们那里找出他们试图解决的问题时,很多时候你会发现他们的解决方案实际上是一个坏主意。因此,在回答时,您可以选择解决他们的解决方案,也可以真诚地尝试帮助他们解决真正的问题。
  • 这种只想要快速答案而不是正确探索真正的潜在问题并且不信任能够提供助手的人的整个心态是 StackOverflow 的失败,你可以阅读我不得不说的内容过去在blog.dscpl.com.au/2012/12/let-me-google-that-for-you.html
【解决方案2】:

我刚刚用 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':'U-2ESH8AAAEAACYQU@MAAABE',
   'mod_wsgi.daemon_start':'1409123400512693'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2013-07-12
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多