Как предоставить client_address всем методам, используя xmlrpclib?

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

Я пробую это:

Сервер

импортировать xmlrpclib

из SimpleXMLRPCServer импортировать SimpleXMLRPCServer

сервер = SimpleXMLRPCServer(("localhost", 8000))

def MyIp(): вернуть «Ваш IP: %s» % server.socket.getpeername()

server.register_function(MyIP)

сервер.serve_forever()

Клиент

импортировать xmlrpclib

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

распечатать se.MyIp()

Ошибка

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

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


person Lauro Oliveira    schedule 11.06.2009    source источник


Ответы (1)


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

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

person Alex Martelli    schedule 11.06.2009
comment
Я использую тот же подход. Подкласс SimpleXMLRPCRequestHandler и добавление client_address к параметрам вызывающей функции. - person Jiri; 11.06.2009