[Twisted-web] Re: Setting up a project.

Jean-Paul Calderone exarkun at divmod.com
Wed Aug 6 17:56:02 EDT 2008


On Wed, 6 Aug 2008 16:40:49 -0500, Govind Salinas <blix at sophiasuchtig.com> wrote:
> [snip]
>
>I had tried using Django for what I was doing but I did not sure if it
>would end up as a nice fit.  When I started using twisted, I borrowed
>the regex->page mapping from them.  This is how I implemented it:
>
> [snip]
>
>    def render_GET(self, request):
>        path = request.path[1:]
>        uri = request.uri[1:]
>        for mapping, f in self._mappings:
>            match = mapping.match(uri)
>            if match:
>                vars = match.groupdict()
>                print 'serving:', f
>                lookup = TemplateLookup(directories=['/'])
>                return Template(filename=f, lookup=lookup).render(**vars)
>        path = os.path.join(self._template_dir, path)
>        if os.path.isfile(path):

Note that if request.uri is something like "//etc/passwd", your server
might serve up some content you'd rather not see made public.  One
advantage of twisted.web.static.File is that you can specify a directory
and it will only allow things inside that directory to be served.

>            f = None
>            try:
>                idx = path.rfind('.')
>                print 'serving static:', path, path[idx + 1:]
>                type = _mime_types.get(path[idx + 1:], 'text/plain')
>                request.setHeader('content-type', type)
>                print request.headers, type
>                f = file(path, 'r')
>                return f.read()
>            except:
>                print 'failed to serve:', path
>                raise
>            finally:
>                if f:
>                    f.close()

Another advantage of File is that it won't load the entire file into
memory all at once, it will set the content-type for you, and it will
generate 404s if necessary.

Jean-Paul



More information about the Twisted-web mailing list