2011-08-05 131 views
0

我正在使用SOAP网络服务的soaplib库, 我想在我的Web服务方法中创建客户端请求时访问客户端的IP地址。如何在soap web服务方法中获取客户端ip?

class HelloWorldService(DefinitionBase): 
    @soap(String, Integer, _returns=Array(String)) 
    def say_hello(self, name, times): 
     # here I want to Access client's IP Address 
     pass 

这里是我的服务器的伪代码...

server = make_server('localhost', 
        7789, 
        HelloWorldApplication(Application([HelloWorldService], 'hello'))) 
print "serving http://localhost:7789/hello?wsdl" 
server.serve_forever() 

回答

1

make_server我假设你正在使用BaseHTTPServer或建立在它上面的软件包之一。

在您的请求处理代码中,您应该能够找到对客户端套接字的引用。使用它获取getsockname()并检索客户端IP和TCP源端口。

例如,如果插座参考是在基类socket,你可以:

class HelloWorldService(DefinitionBase): 
    @soap(String, Integer, _returns=Array(String)) 
    def say_hello(self, name, times): 
     # here I want to Access client's IP Address 
     print "Client IP:", self.socket.getsockname()[0] 

我砍死向上例如,要检索服务器上的监听套接字的IP(这是没有客户端套接字!)

>>> httpd = make_server('', 8000, simple_app) 
>>> dir(httpd) 
['RequestHandlerClass', '_BaseServer__is_shut_down', '_BaseServer__shutdown_request', '__doc__', '__init__', '__module__', '_handle_request_noblock', 'address_family', 'allow_reuse_address', 'application', 'base_environ', 'close_request', 'fileno', 'finish_request', 'get_app', 'get_request', 'handle_error', 'handle_request', 'handle_timeout', 'process_request', 'request_queue_size', 'serve_forever', 'server_activate', 'server_address', 'server_bind', 'server_close', 'server_name', 'server_port', 'set_app', 'setup_environ', 'shutdown', 'shutdown_request', 'socket', 'socket_type', 'timeout', 'verify_request'] 
>>> dir(httpd.socket) 
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_sock', 'accept', 'bind', 'close', 'connect', 'connect_ex', 'dup', 'family', 'fileno', 'getpeername', 'getsockname', 'getsockopt', 'gettimeout', 'listen', 'makefile', 'proto', 'recv', 'recv_into', 'recvfrom', 'recvfrom_into', 'send', 'sendall', 'sendto', 'setblocking', 'setsockopt', 'settimeout', 'shutdown', 'type'] 
>>> httpd.socket.getsockname() 
('0.0.0.0', 8000) 

获得实际的客户机IP是一个小更复杂的例子,因为你不会对客户端Socket对象的引用,直到请求处理程序回调被调用。一个例子使用BaseHTTPServer:

import BaseHTTPServer 

class Handler(BaseHTTPServer.BaseHTTPRequestHandler): 

    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     self.wfile.write("Client IP: %s" % self.connection.getsockname()[0]) 

httpd = BaseHTTPServer.HTTPServer(("", 8000), Handler) 
httpd.serve_forever() 

我没有在系统上soaplib在这里给你一个更精确的例子,但Socket对象是藏在某个地方。

+0

我需要客户端的IP地址而不是服务器之一,'httpd.socket.getsockname()'将返回服务器的IP地址...和'DefinitionBase'没有叫任何属性''socket''因此'self.socket'是'HelloWorldService'类中的AttributeError! – shahjapan

+0

我没有soaplib的副本来查找DefinitionBase的参考。在BaseHTTPServer客户端对象中,套接字对象称为连接。 self.connection.getsockname()返回客户端IP。我会更新帖子。您必须在DefinitionBase中找到正确的套接字引用。它在那里。 –

+0

SOAP本身是独立于传输的,因此不知道IP地址的任何内容,我可以在'on_wsdl_call'中获取IP地址,但是可以在'wsgi.Application'类中获取IP地址! – shahjapan

0

解决:

's/self.connection.getsockname()[0]/self.client_address[0]/' 
相关问题