Как получить IP при использовании SimpleXMLRPCDispatcher в Django - PullRequest
0 голосов
/ 23 сентября 2010

Наличие кода на основе http://code.djangoproject.com/wiki/XML-RPC:

from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
from django.http import HttpResponse

dispatcher = SimpleXMLRPCDispatcher(allow_none=False, encoding=None) # Python 2.5

def rpc_handler(request):
    """
    the actual handler:
    if you setup your urls.py properly, all calls to the xml-rpc service
    should be routed through here.
    If post data is defined, it assumes it's XML-RPC and tries to process as such
    Empty post assumes you're viewing from a browser and tells you about the service.
    """

    if len(request.POST):
        response = HttpResponse(mimetype="application/xml")
        response.write(dispatcher._marshaled_dispatch(request.raw_post_data))
    else:
        pass # Not interesting
    response['Content-length'] = str(len(response.content))
    return response

def post_log(message = "", tags = []):
    """ Code called via RPC. Want to know here the remote IP (or hostname). """
    pass

dispatcher.register_function(post_log, 'post_log')

Как можно получить IP-адрес клиента в определении "post_log"? Я видел IP-адрес клиента в Python SimpleXMLRPCServer? , но не могу применить его к моему случаю.

Спасибо.

1 Ответ

0 голосов
/ 05 октября 2010

Хорошо, я мог бы сделать это ... с некоторыми изящными советами ...

Во-первых, я создал свою собственную копию SimpleXMLRPCDispatcher, которая унаследовала от него все, и получил два метода:

class MySimpleXMLRPCDispatcher (SimpleXMLRPCDispatcher) :
    def _marshaled_dispatch(self, data, dispatch_method = None, request = None):
        # copy and paste from /usr/lib/python2.6/SimpleXMLRPCServer.py except
        response = self._dispatch(method, params)
        # which becomes
        response = self._dispatch(method, params, request)

    def _dispatch(self, method, params, request = None):
        # copy and paste from /usr/lib/python2.6/SimpleXMLRPCServer.py except
        return func(*params)
        # which becomes
        return func(request, *params)

Тогда в моем коде все, что нужно сделать, это:

# ...
if len(request.POST):
    response = HttpResponse(mimetype="application/xml")
    response.write(dispatcher._marshaled_dispatch(request.raw_post_data, request = request))
# ...
def post_log(request, message = "", tags = []):
    """ Code called via RPC. Want to know here the remote IP (or hostname). """
    ip = request.META["REMOTE_ADDR"]
    hostname = socket.gethostbyaddr(ip)[0]

Вот и все. Я знаю, что это не очень чисто ... Любое предложение для более чистого решения приветствуется!

...