[Twisted-web] web2 post/put examples

L. Daniel Burr ldanielburr at mac.com
Tue Apr 17 16:25:54 CDT 2007


Hi Mark,

On Tue, 17 Apr 2007 15:49:10 -0500, Mark Feldman  
<feldman+twisted-web at shinkuro.com> wrote:

> Does anyone have a simple example of processing either a post or put on  
> the server side using web2?  I've had no problem serving up web pages  
> from a variety of sources (files, database backends).   The changes  
> needed to support data back fro the user -- undoubtedly a set of  
> deferred methods in the right place -- escape me.  Thanks.
>

For POST, you could use resource.PostableResource, which will take
care of parsing your run-of-the-mill form posting.  Just subclass
resource.PostableResource, and implement the "render" method.

For PUT, and also for cases where your are POSTING non-form data,
e.g., an XML payload, you need to subclass resource.Resource,
implement the desired method (http_POST, http_PUT), and then hook
the request.stream up to a processing chain.

Example:

 from twisted.web2 import resource, stream


class Foo(resource.Resource):
     _allowedMethods = ('POST', 'PUT')

     def _finished(self, result, request):
         # return some http.Response

     def _failed(self, reason, request):
         # return some http.Response

     def http_POST(self, request):
         def handleData(data):
             # process each chunk of data as it arrives

         # readStream will keep calling handleData until the
         # entire stream has been read.
         d = stream.readStream(request.stream, handleData)

         # these callbacks/errbacks will be called when readStream
         # has finished reading the stream.
         d.addCallbacks(
             self._finished,
             self._failed,
             callbackArgs=(request,),
             errbackArgs=(request,)
         )

         # Catch any errors that occur in self._finished.
         d.addErrback(self._failed, request)

         return d

     def http_PUT(self, request):
         # Just handle things the same way POST does
         return self.http_POST(request)


Hope this helps,

L. Daniel Burr



More information about the Twisted-web mailing list