Как выставить client_address для всех методов, используя xmlrpclib? - PullRequest
2 голосов
/ 11 июня 2009

Я создаю небольшой SimpleXMLRPCServer для проверки ip клиента.

Я пытаюсь это:

Сервер

import xmlrpclib

из SimpleXMLRPCServer import SimpleXMLRPCServer

server = SimpleXMLRPCServer (("localhost", 8000))

def MyIp (): return "Ваш ip:% s"% server.socket.getpeername ()

server.register_function (MyIP)

server.serve_forever ()

Клиент

import xmlrpclib

se = xmlrpclib.Server ("http://localhost:8000")

print se.MyIp ()

Error

xmlrpclib.Fault:: (107, 'Конечная точка транспорта не подключена') ">

Как сделать client_address видимым для всех функций?

1 Ответ

3 голосов
/ 11 июня 2009

Если вы хотите, например, передать client_address в качестве первого аргумента каждой функции, вы можете создать подкласс SimpleXMLRPCRequestHandler (передать ваш подкласс в качестве обработчика при создании экземпляра SimpleXMLRPCServer) и переопределить _dispatch (чтобы добавить self.client_address к кортеж params, а затем делегировать остальное SimpleXMLRPCRequestHandler._dispatch). Если этот подход в порядке, и вы хотите увидеть код, просто спросите!

Я не уверен, как вы могли бы безопасно использовать что-либо, кроме аргументов функции, чтобы "сделать client_address видимым" - нет client_address в качестве голого имени, глобального или иного, есть только self.client_address каждый экземпляр класса обработчика запросов (и такие хаки, как копирование его в глобальные переменные, чувствуют действительно действительно отвратительно - и небезопасно при многопоточности и т. д. и т. д.).

...