Future updates to this "Toscawidget mod_rewrite mapper" will be stored
here:

http://trac.pagodacms.org/browser/pagoda/projects/toscawidgets_modrewrite_mapper

-Ian

On Sep 28, 3:37 pm, Ian Charnas <[EMAIL PROTECTED]> wrote:
> Phew, long breakfast ;)
>
> I finished this recipe, it's very robust and ready for you to use.
> Everything is the same except the mapper.py file has changed to 
> this:http://paste.turbogears.org/paste/1658
>
> If you add widgets to a module, you'll just need to send a SIGALRM
> signal to the mapper.py process (kill -s SIGALRM <process-id>) so it
> will refresh its cache of modules.
>
> Hope someone finds this useful, years later, on a google search ;)
> -Ian Charnas
>
> On Sep 26, 8:28 am, Ian Charnas <[EMAIL PROTECTED]> wrote:
>
> > When I woke up this morning I realized there is a big security hole in
> > my solution.  Namely, anyone will be able to download anything that's
> > in your python lib directories.  To prevent this, it will be necessary
> > to modify the python script to use
> > toscawidgets.resources.registry.get_prefixed() to determine if a file
> > is part of a toscawidget or not, and then only serve the file if it's
> > part of a toscawidget.  I will post a full solution later, after I eat
> > breakfast!
>
> > -Ian
>
> > On Sep 25, 9:24 pm, Ian Charnas <[EMAIL PROTECTED]> wrote:
>
> > > Background: Often with a python web framework using ToscaWidgets, you
> > > will want to serve your static files with Apache so they will download
> > > faster.  The typical solution involves having ToscaWidgets generate
> > > the appropriate Apache configuration text to serve the files
> > > statically.
>
> > > Problem: The downside to this typical solution is that every time you
> > > create a new widget, you have to re-generate the configuration and
> > > reload Apache.
>
> > > Solution: I have a solution that uses some advanced features of
> > > mod_rewrite to do this on-the-fly.  My solution uses a mod_rewrite
> > > External Rewriting Engine, which is just a few lines of python code
> > > that convert a URL into the appropriate file path.
>
> > > 1. Apache configuration
>
> > > Let's say you have your web framework (TurboGears, Pylons, or
> > > whatever) running on port 8080.  You want URL's that start with "/
> > > toscawidgets/resources" to go through the External Rewriting Engine
> > > and get converted into file paths, and you want all other URLs to be
> > > proxied to the web framework.  Make sure you have mod_rewrite compiled
> > > and loaded, and then put something like this inside your Server or
> > > VirtualHost configuration block:
>
> > > RewriteEngine On
> > > RewriteMap toscawidgets prg:/path/to/mapper.sh
> > > RewriteRule ^/toscawidgets/resources/(.*) ${toscawidgets:$1} [L]
> > > RewriteRule ^/(.*)http://127.0.0.1:8080/$1[P,L]
>
> > > Not too difficult, right?  The first line turns on mod_rewrite's
> > > RewriteEngine for this Server or VirtualHost.  The next line declares
> > > a "RewriteMap" that points towards a shell script that's responsible
> > > for doing the External Rewriting (we'll look at that in step 2,
> > > below).  The third line says that for all URLs beginning with /
> > > toscawidgets/resources, send the rest of the URL to the 'toscawidgets'
> > > RewriteMap, which is responsible for returning a file path where the
> > > specified resource lives.  The final line proxies all other requests
> > > to the web framework, like normal.
>
> > > 2. External Rewriting Engine
>
> > > So the mapper.sh we specified is our External Rewriting Engine.  Wait,
> > > did I say it was written in python?  It is!  The shell just activates
> > > the WorkingEnv that I happen to use, and then exec's the python
> > > script.  You could use the shell script to set your PYTHONPATH, or
> > > skip the shell script entirely and use mapper.py as your mapper
> > > instead.  I use WorkingEnv though, so I need the shell script in front
> > > of the python script.  My mapper.sh looks like this:
>
> > > ----[snip]----
> > > #!/bin/bash
>
> > > # Activate workingenv
> > > source /path/to/myenv/bin/activate
>
> > > # Call mapper script
> > > exec ./mapper.py
> > > ----[snip]----
>
> > > And then the real work is done by this simple python script, which
> > > accepts the URL pieces sent by that RewriteRule (from line 3 of step
> > > 1) on stdin, figures out which file should be served, and prints the
> > > absolute path to that file to stdout.  mapper.py looks like this:
>
> > > ----[snip]----
> > > #!/usr/bin/python
>
> > > import sys
> > > import string
> > > import os
> > > import pkg_resources
>
> > > while True:
> > >     data = string.strip(sys.stdin.readline())
> > >     if not data:
> > >         print "NULL"
> > >     else:
> > >         path_pieces = data.split("/")
> > >         module_name = path_pieces[0]
> > >         file_name = pkg_resources.resource_filename(
> > >             module_name,
> > >             os.path.join(*path_pieces[1:])
> > >         )
> > >         file_path = os.path.abspath(file_name)
> > >         print file_path
> > >         sys.stdout.flush()
> > > ----[snip]----
>
> > > 3. Framework Configuration
>
> > > Your framework will probably need to know you're deploying it behind a
> > > proxy.  For TurboGears, you just have to add this to your dev.cfg or
> > > prod.cfg file:
>
> > > base_url_filter.on = True
> > > base_url_filter.use_x_forwarded_host = True
>
> > > 4. You're done!
>
> > > Isn't open source amazing!  Congratulate yourself with a nice glass of
> > > juice or tea!  Remember to get up and stretch.  Enjoy life!
>
> > > -Ian Charnas


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to