我正在尝试使用 Python 制作一个非常简单的 XML RPC 服务器,它提供基本身份验证 + 获取连接用户 IP 的能力。让我们以 http://docs.python.org/library/xmlrpclib.html 中提供的示例为例:
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
def is_even(n):
return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(is_even, "is_even")
server.serve_forever()
现在,这背后的第一个想法是让用户在允许他使用这些功能之前提供凭据并对其进行处理。我需要非常简单的身份验证,例如只是一个代码。现在我正在做的是强制用户在函数调用中提供此代码并使用 if 语句对其进行测试。
第二个是在他调用函数时能够获取用户IP,或者在他连接到服务器后存储它。
此外,我已经有一个正在运行的 Apache 服务器,将其集成到其中可能会更简单。
你怎么看?
请您参考如下方法:
这是一个我发现有帮助的相关问题:
IP address of client in Python SimpleXMLRPCServer?
对我有用的是在服务器的重写 finish_request 方法中获取 client_address,将其存储在服务器本身中,然后在重写的服务器 _dispatch 例程中访问它。您也可以从方法中访问服务器本身,但我只是想将 IP 地址作为自动第一个参数添加到我所有的方法调用中。我使用字典的原因是因为我还要添加一个 session token ,也许还有其他元数据。
from xmlrpc.server import DocXMLRPCServer
from socketserver import BaseServer
class NewXMLRPCServer( DocXMLRPCServer):
def finish_request( self, request, client_address):
self.client_address = client_address
BaseServer.finish_request( self, request, client_address)
def _dispatch( self, method, params):
metadata = { 'client_address' : self.client_address[ 0] }
newParams = ( metadata, ) + params
return DocXMLRPCServer._dispatch( self, method, metadata)
注意这会破坏像 system.listMethods() 这样的内省(introspection)函数,因为它不需要额外的参数。一种想法是检查“系统”的方法名称。在这种情况下只需传递常规参数即可。
