Version: 0.1.5
4 October 2009
Table of Contents
RPC4Django is an XMLRPC and JSONRPC server for Django powered projects. Simply plug it into any existing Django project and you can make your methods available via XMLRPC and JSONRPC. In addition, it can display nice documentation about the methods it makes available in a more customizable way than DocXMLRPCServer. RPC4Django is not affiliated with the Django Project.
RPC4Django is licensed under the BSD license.
Copyright (c) 2009, David Fischer
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY David Fischer ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David Fischer BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
RPC4Django has been tested on Mac OS, Linux and Windows.
This is the preferred method for installing RPC4Django.
$> tar xvfz rpc4django-x.y.z.tar.gz $> cd rpc4django-x.y.z $> python setup.py install
$> easy_install rpc4django
$> pip install rpc4django
This method installs RPC4Django only for one specific django project but does not require any special system access.
$> tar xvfz rpc4django-x.y.z.tar.gz $> cd rpc4django-x.y.z $> cp -r rpc4django YOUR_DJANGO_PROJECT_DIRECTORY
First, you need to add new url pattern to your root urls.py file. This file should be the one pointed to by ROOT_URLCONF in settings.py. You can replace r'^RPC2$' with anything you like.
# urls.py #... urlpatterns = patterns('', # if installed via no install method #(r'^RPC2$', 'YOURPROJECT.rpc4django.views.serve_rpc_request'), # if installed via source or easy_install (r'^RPC2$', 'rpc4django.views.serve_rpc_request'), )
Second, add RPC4Django to the list of installed applications in your settings.py.
# settings.py #... INSTALLED_APPS = ( # if installed via no install #'YOURPROJECT.rpc4django', # if installed via source or easy_install 'rpc4django', )
Lastly, you need to let RPC4Django know which methods to make available. This is done with the decorator @rpcmethod. RPC4Django imports all the apps in INSTALLED_APPS and makes any methods importable via __init__.py with the @rpcmethod decorator available as RPC methods. You can always write your RPC methods in another module and simply import it in __init__.py.
# testapp/__init__.py from rpc4django import rpcmethod # This imports another method to be made available as an RPC method # This method should also have the @rpcmethod decorator # from mymodule import myrpcmethod # The doc string supports reST if docutils is installed @rpcmethod(name='mynamespace.add', signature=['int', 'int', 'int']) def add(a, b): '''Adds two numbers together >>> add(1, 2) 3 ''' return a+bThe decorator @rpcmethod accepts three optional parameters:
- name - is the name under which the method will be made externally available. It defaults to the method's real name.
- signature - is the signature of the method and will be returned by calls to the XMLRPC introspection method system.methodSignature. It is of the form: [return_value, arg1, arg2, arg3, ...]. All of the types should be XMLRPC types (eg. struct, int, array, etc. -- see the XMLRPC spec for details). Since python is relatively loosely typed, all types are set to object by default.
- permission - the Django permission required to execute this method [new in 0.1.5]
XMLRPC libraries exist in virtually every major programming language. The usage varies from library to library, but I'll give a python example using the xmlrpclib standard library:
from xmlrpclib import ServerProxy s = ServerProxy('http://localhost:8000') s.system.listMethods()
JSONRPC is less mature than XMLRPC and libraries are not as common. However, one of the main benefits of JSONRPC is that it can be used more easily from Javascript or Actionscript since JSON is their native format. There is an older JSONRPC library for python on json-rpc.org. Here is an example using that library:
from jsonrpc import ServiceProxy s = ServiceProxy('http://localhost:8000') s.rpc4django.mytestmethod(1,2,3)
For an example of JSONRPC being used from Javascript running in a browser, please see the demo site.
The unit tests can be run using manage.py
$> python manage.py test rpc4django
These are settings that can go in your project's settings.py:
RPC4Django can be used with authenticated HTTP(s) requests and Django's authentication and authorization. [new in 0.1.5, requires Django 1.1+] It uses RemoteUserMiddleware or another derived middleware which is only built-in to Django 1.1 and higher. It is possible to use it with Django versions prior to 1.1, but it would require the RemoteUserMiddleware and the RemoteUserBackend to be added manually.
Firstly, the webserver should be configured to use basic HTTP authentication or some sort of single sign on (SSO) solution.
In settings.py, the following changes need to be made:
MIDDLEWARE_CLASSES = ( # ... # Must be enabled for RPC4Django authenticated method calls 'django.contrib.auth.middleware.AuthenticationMiddleware', # Required for RPC4Django authenticated method calls # Requires Django 1.1+ 'django.contrib.auth.middleware.RemoteUserMiddleware', ) # Required for RPC4Django authenticated method calls # Requires Django 1.1+ AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.RemoteUserBackend', )
To protect a method, it needs to be defined with the @rpcmethod decorator and the permission parameter.
from rpc4django import rpcmethod @rpcmethod(name='rpc4django.secret', signature=['string'], permission='auth.add_group') def secret(): return "Successfully called a protected method"
To call an authenticated method from the Python command prompt, use the following:
from xmlrpclib import ServerProxy s = ServerProxy('https://username:password@example.com') s.rpc4django.secret()
Version 0.1.5 (4 October 2009)
Version 0.1.4 (31 August 2009)
Version 0.1.3 (15 July 2009)
Version 0.1.2 (13 July 2009)
Version 0.1.1 (11 July 2009)
Version 0.1.0 (6 July 2009)