[Twisted-web] confusion with general web serving

L. Daniel Burr ldanielburr at mac.com
Tue Apr 17 10:20:27 CDT 2007


On Tue, 17 Apr 2007 09:57:24 -0500, Jonathan Vanasco  
<twisted-python at 2xlp.com> wrote:

> I asked this on the -python list, some suggested I re-ask here.
>
> I'm trying to build a small daemon that does the following:
>
> 	1_ parse the uri for the key to an image
> 	2_ validate that key against db
> 		3_ if not valid, render a 404
> 		4_ if valid, map to an arbitrary file on the fs  ( pulled from db )
> 		4b_ or check a bdb to see if its on the fs, pull a copy off of  
> amazon's s3 otherwise and update the cachedb to note we have it
>
> The issue that I'm having:
>
> 	i originally tried doing this based on one of the chapters in the  
> twisted o'reilley book.  i ran into issues when I tried to render an  
> image -- i couldn't figure out how to do that.
>
> 	somone on twisted web suggested i not use the protocol and instead use  
> site (http://twistedmatrix.com/projects/web/documentation/howto/ 
> using-twistedweb.html#auto2 ).   i ran into issues when trying to render  
> status codes and add in proxy functionality.
>
>
> I'm at a loss on what I should be using.  can someone offer advice ?

You are attacking this at too low a level, I think.  In essence you are
building a fixed-function web server, which is a waste of your time and
resources, because twisted already has a decent web server implementation.

Just make a .tac file for starters, something along these lines:

--------------webserver.tac-------------------------------------

# UNTESTED CODE I PULLED OUT OF MY EAR!

 from twisted.application import internet, service
 from twisted.python import log
 from twisted.web2 import channel, http
 from twisted.web2 import resource, responsecode, server


class Image(resource.LeafResource):
     def __init__(self, key):
         self.key = key

     def render(self, request)
         # Locate the image, return some kind
         # of http.Response, or a defer.Deferred


class Root(resource.Resource):
     addSlash = True

     def childFactory(self, request, name):
         return Image(name)

     def render(self, request):
         return http.Response(
             code=responsecode.OK,
             headers={},
             stream='Blah'
         )


root = Root()
site = server.Site(root)
port = 8080
application = service.Application('ImageServer')
svc = internet.TCPServer(port, channel.HTTPFactory(site))
svc.setServiceParent(application)

---------------------------------------------------------------

Run the above with twistd -noy webserver.tac.  This should be
sufficient to get you started.

Hope this helps,

L. Daniel Burr



More information about the Twisted-web mailing list