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 -~----------~----~----~----~------~----~------~--~---

