2

我正在尝试使用 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 服务器,将其集成到其中可能会更简单。

你怎么看?

4

1 回答 1

0

这是一个我发现有帮助的相关问题:

Python SimpleXMLRPCServer中客户端的IP地址?

对我有用的是在服务器的覆盖的 finish_request 方法中获取 client_address,将其存储在服务器本身中,然后在覆盖的服务器 _dispatch 例程中访问它。您也可以从方法中访问服务器本身,但我只是想将 IP 地址作为自动第一个参数添加到我的所有方法调用中。我使用 dict 的原因是因为我还要添加会话令牌,也许还有其他元数据。

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() 这样的内省函数,因为它不需要额外的参数。一种想法是检查“系统”的方法名称。并在这种情况下传递常规参数。

于 2012-06-05T13:46:31.890 回答