I last took a look at Python (in version 2.4) for web service clients several years ago. As a scripting language, Python is popular for utility quick projects and comes pre-installed on many systems. Python scripts,
A major effort by the Python developer group has created Python 3.0, released in late 2008. Major changes to the handling of strings (now Unicode) and cleanup of obsolete methods mean that backwards compatibility to Python 2 programs has been lost. As a parallel development, Python version 2.6 has also been released at the same time with the intent of creating an easy migration path for Python developers to eventual use of version 3.0. Google's App Engine, which lets you run your web applications on Google hardware, currently supports Python version 2.5 but is being updated to 3.0. Since many of the Python developer community, including Guido van Rossum, the original author of Python, work for Google, this update should occur rapidly.
Support for Networking
The Python standard library comes with extensive support for networking, from socket level to HTTP and email protocols. The socket tools support both IPv4 and IPv6 addressing. The low level protocols UDP and TCP are supported and the standard library contains support for creating your own custom servers.
A large variety of Python based web application frameworks have sprung up, but the Python community appears to have settled on WSGI, the Web Server Gateway Interface, as a unifying specification. Commercial and open source frameworks supporting WSGI include the Google App Engine. Generally these frameworks have not been completely updated to Python 3.
Python 3 supports the W3C DOM model for XML at the "level 2" recommendation. There is also a "lightweight" DOM implementation corresponding to the W3C level 1 (circa 1998) without the added complexity of namespace support. A rather clever "pulldom" API provides for creating partial DOM structures during SAX parsing, especially handy when working with very large XML documents. Primitive parsing functions are not written in Python but use the "expat" parser written in C for speed. Expat is a non-validating parser. Limited XPath support exists but is not well documented.
The Python community does not appear to be too enthusiastic about creating support for SOAP, WSDL and WS-* standards, although some projects exist. REST style web services would appear to be a better fit for Python given Python's emphasis on simplicity.
Python and JSON
The JSON library lets you serialize the data content of a Python object, for example in response to a browser request. Furthermore, you can populate Python data structures from JSON text. The Google App Engine provides extensive support for creating and using JSON formatted data.
Python and XML-RPC
XML-RPC is the simple protocol for executing remote procedure calls using XML encoded messages. This is, of course, the idea which accumulated lots of extra complexity and evolved into SOAP. XML-RPC implementations are available for many languages in addition to Python, including Java and .NET.
Example code in the version 3 distribution shows a huge number of alternative ways to create a server to handle XML-RPC style requests to execute Python methods and return properly formatted XML. Your program does not have to know a thing about XML, the Python toolkit handles all of the interpretation of a request in terms of Python methods and variables, and formats the response.
An exceptionally cool feature provides for creating HTML documentation of a Python XML-RPC method in response to a simple HTML GET directed to the service URL. To refresh your memory as to how simple XML-RPC is in comparison to SOAP, I ran the example XML-RPC server and client programs included in the Python 3.0 standard library and captured the request and response. Here is the request generated by only two lines of code:
POST /RPC2 HTTP/1.1 Host: localhost:8080 Accept-Encoding: identity Content-Length: 187 Content-Type: text/xml User-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com) <?xml version='1.0'?> <methodCall> <methodName>pow</methodName> <params> <param> <value><int>2</int></value> </param> <param> <value><int>5</int></value> </param> </params> </methodCall>
On the server side, a couple of lines created a server instance and registered the "pow" method. The server response was:
HTTP/1.0 200 OK Server: BaseHTTP/0.6 Python/3.0 Date: Thu, 29 Jan 2009 20:29:17 GMT Content-type: text/xml Content-length: 122 <?xml version='1.0'?> <methodResponse> <params> <param> <value><int>32</int></value> </param> </params> </methodResponse>
If you already have a body of Python to support, the switch from earlier versions to Python 3 will require significant effort but this will pay off due to the support of Unicode. If you need a language to develop applications to support Unicode and run on a wide variety of operating system platforms, Python is an obvious choice. If you are looking for a scripting language to do some rapid prototyping of SOA style applications with, you will probably find the functions you want in Python 3.0. If you need WS-* support for SOAP/WSDL, you should probably look elsewhere.
This was first published in February 2009