# RPC4Django Documentation

Version: 0.1.1

11 July 2009

Table of Contents

- Overview
  - Website
  - Contributors
  - Features
- License
- Installation
  - Prerequisites
  - Source Install Method
  - Easy Install Method
  - No Installation Method
- Configuration
- Additional Information and Settings
  - How RPC4Django Handles Requests
  - Customizing the Method Summary
  - Optional Settings
- Planned Features
- Changelog

## Overview

### Website

- http://www.davidfischer.name/rpc4django

### Contributors

- David Fischer

### Features

RPC4Django is an XMLRPC and JSONRPC application 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.

- Detects request type (JSONRPC or XMLRPC) based on content
- Easy identification of RPC methods via a decorator
- Pure python and requires no external modules except Django
- Customizable RPC method documentation including reST
- Supports XMLRPC and JSONRPC introspection
- Supports method signatures (unlike SimpleXMLRPCServer)
- Easy installation and integration with existing Django projects
- Licensed for inclusion in open source and commercial software

## License

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:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of rpc4django nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

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.

## Installation

### Prerequisites

RPC4Django has been tested on Mac OS, Linux and Windows.

- Python 2.4 - 2.6
- Django 1.0+
- Docutils (optional)

### Source Install Method

This is the preferred method for installing RPC4Django. It may require special privileges such as sudo.

    $> tar xvfz rpc4django-x.y.z.tar.gz
    $> cd rpc4django-x.y.z
    $> python setup.py install

### Easy Install Method

RPC4Django can be installed this way if setuptools is installed and easy_install is in your path. It may require special privileges such as sudo.

    $> easy_install rpc4django

### No Installation Method

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

## Configuration

1. 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'),
   >     )

2. 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',
   >     )

3. 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+b

   > The decorator `@rpcmethod` accepts two 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.

## Additional Information and Settings

### How RPC4Django Handles Requests

- If the request is a GET request, return an HTML method summary
- A POST request with content-type header set to `text/xml` or `application/xml` will be processed as XMLRPC
- A POST request with content-type header containing `json` or `javascript` will be processed as JSONRPC
- Try to parse the POST data as xml. If it parses successfully, process it as XMLRPC
- Process it as JSONRPC

### Customizing the Method Summary

- The method summary displays docstrings, signatures, and names from methods marked with the `@rpcmethod` decorator.
- The summary is served from a template `rpc4django/rpcmethod_summary.html` and can be customized in a similar way to the django admin.
- The method summary supports reST in docstrings if the docutils library is installed. Plain text is used otherwise. Warnings and errors are not reported in the output.

### Optional Settings

These are settings that can go in your project's `settings.py`:

`RPC4DJANGO_LOG_REQUESTS_RESPONSES=True|False` (default True)
  By default RPC4Django will log (using the python logging module) all requests and responses. This can be disabled by setting `RPC4DJANGO_LOG_REQUESTS_RESPONSES=False`.
`RPC4DJANGO_RESTRICT_INTROSPECTION=True|False` (default False)
  By default RPC4Django registers the standard XMLRPC and JSONRPC introspection functions. This can be disabled by setting `RPC4DJANGO_RESTRICT_INTROSPECTION=True`.
`RPC4DJANGO_RESTRICT_JSONRPC=True|False` (default False)
  If `RPC4DJANGO_RESTRICT_JSONRPC=True`, RPC4Django will never serve a JSONRPC request. Instead, either XMLRPC will be tried or status code 404 will be returned.
`RPC4DJANGO_RESTRICT_XMLRPC=True|False` (default False)
  If `RPC4DJANGO_RESTRICT_XMLRPC=True`, RPC4Django will never serve an XMLRPC request. Instead, either JSONRPC will be tried or status code 404 will be returned.
`RPC4DJANGO_RESTRICT_DOCUMENTATION=True|False` (default False)
  If `RPC4DJANGO_RESTRICT_DOCUMENTATION=True`, status code 404 will be returned instead of serving the method summary as a response to a GET request.

## Planned Features

- Authenticated view that ties in with Django's auth system
- Testing an RPC method directly from the documentation (like XMLRPC for PHP)
- Fix some failing unit tests on older python versions

## Changelog

Version 0.1.1 (11 July 2009)

- Improved documentation by integrating reST
- Allowed reST markup in rpcmethod docstrings
- Fix easy_install problems related to django templates
- Tested version compatibility
- Allowed analyzing post data when content-type cannot tell whether the data is XML or JSON

Version 0.1.0 (6 July 2009)

- First version of RPC4Django