[Web-SIG] wsgiorg.routing_args and original SCRIPT_NAME
Ian Bicking
ianb at colorstudy.com
Thu Jan 24 21:45:11 CET 2008
Manlio Perillo wrote:
> I have implemented the wsgiorg.routing_args specification, using the
> code in the example.
>
> However I have a problem, and I can't see a good solution.
>
> Suppose that an application is mounted (embedded in a web server) at
> location "/example".
>
> The application script executed by the server simply setups the
> routings, database connections and so.
>
> Let's suppose that the request uri is "/example/login/".
>
> For the main application, SCRIPT_NAME is "/example".
> For the application at "/login", SCRIPT_NAME is "/example/login".
>
>
> My problem is that I want, in the page generated by "login" application,
> return an anchor in the form "/example/logout/".
>
> The usual solution is to do environ['SCRIPT_NAME'] + '/logout', but this
> will return "/example/login/logout/", and not "/example/logout/".
>
> This seems to be not possible with the current specifications, since the
> "original" SCRIPT_NAME is lost.
>
> What is the best solution?
>
> 1) Do not change SCRIPT_NAME, and instead add a wsgiorg.consumed_path, a
> list.
>
> This means that the request uri recostruction must be changed:
> SCRIPT_NAME = SCRIPT_NAME + '/'.join(wsgiorg.consumed_path)
I suppose you could leave stuff on PATH_INFO. But that doesn't seem to
fit with the idea of PATH_INFO. Also, will it be strictly
SCRIPT_NAME/consumed_path/PATH_INFO, or could it be
SCRIPT_NAME/consumed_path/some_other_parsing/consumed_path/PATH_INFO --
after all, there's cases where stuff gets pushed from PATH_INFO to
SCRIPT_NAME, and if consumed_path is in between, which one do you push
stuff to?
> 2) Store a wsgiorg.original_script_name, with the value seen by the
> routing application.
I guess I usually do something like this, typically storing
myapp.base_path for use when I am generation application-absolute URLs
(like /logout). Then at the first chance (before running any kind of
routing) I do "environ['myapp.base_path'] = environ['SCRIPT_NAME']".
This ad hoc technique works fine, but is very ad hoc. I'm not sure what
the best way to handle this is, really. I'm not sure there's a singular
root for an entire request, if you are nesting applications, so a single
key (wsgiorg.original_script_name) doesn't seem quite right.
I can't remember what Routes does for URL generation. Maybe it leaves
SCRIPT_NAME alone? I think so.
Ian
More information about the Web-SIG
mailing list