Python で、XMLRPC を使う。

Python で XMLRPC を扱うには、涙がちょちょぎれる(死語?)ほど簡単であった。XMLRPC サーバ側を Drupal にすると、その生産性は何倍にもなるであろう。 そこでまず、
  • XMLRPC サーバとしての Drupal 側ではアクセスしてきた XMLRPC クライアントの IP アドレスを返してあげる機能
すなわち get_addr メソッドを実装する。そして
  • Drupal にアクセスして get_addr メソッドをコールする Python の XMLRPC クライアント
を考えてみる。 しかも Drupal の XMLRPC サーバには、Drupal のユーザー名とパスワード(今回は admin / password)でログインチェックも行うようにする。
<?php

define
('EXAMPLE_PRIVILEGE_ACCESS', 'access to this server');

/**
* Implementation of hook_perm().
* Define the permissions this module uses
*/
function example_perm() {
  return array(
EXAMPLE_PRIVILEGE_ACCESS);
}

function
example_xmlrpc() {
  return array(
     
'example.get_addr' => '_example_get_addr'
 
);
}

/**
* Return a bootstrap servers
* @return a bootstrap servers
*/
function _example_get_addr($username = NULL, $password = NULL) {

 
_example_validate_user($username, $password);

 
$ip_addr = $_SERVER['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
  return array(
   
'ip_addr' => $ip_addr
 
);
}

/**
* Ensure that the given user has permission.
*/
function _example_validate_user($username, $password) {

  global
$user;

 
$user = user_authenticate($username, $password);

  if (
$user->uid) {
    return
user_access(example_PRIVILEGE_ACCESS, $user);
  }
  return
FALSE;
}

?>
Python の XMLRPC クライアントは以下の通り。太字で示した部分。こんな簡単でいいのだろうか?
import socket

# Drupal's URL, username and password
XML_SERVER_URL = 'https://yourdomain.com/xmlrpc.php';
USERNAME = 'admin'
PASSWORD = 'password'

# Create an object to represent our server.
<strong>server = xmlrpclib.Server(XML_SERVER_URL)</strong>

# Call the server and get our result.
<strong>result = server.example.get_addr(USERNAME, PASSWORD)</strong>
ip_addr = result['ip_addr']
print 'IP Address: ' . ip_addr
トラックバック URL: https://perltips.twinkle.cc/trackback/253