|
Tom Emerson
tree at basistech.com
Tue Jul 31 15:31:26 EST 2001
Attached is a small patch to mod_python 2.7.5 which provides support
for doing an internal_redirect. I've only done minimal testing on this
but it appears to work.
I added a new method to the request object, internal_redirect. It
takes a single string argument which is the local URI to redirect
to. After calling this method your handler should just return
apache.OK.
from mod_python import apache
def handler(req):
req.internal_redirect("/redirected.html")
return apache.OK
I also added an exception class, InternalRedirect, to
mod_python.apache. It takes a single argument which is the local URI
to redirect to. This is used by a modification to Publisher which
allows you to perform an internal redirect simply by raising an
InternalRedirect exception:
from mod_python import apache
def test(req):
raise apache.InternalRedirect("/redirected.html")
The request object's "main" member is None if the current request is
the "main" request.
Share and enjoy.
-------------- next part --------------
*** ./lib/python/mod_python/publisher.py.orig Mon May 14 18:17:21 2001
--- ./lib/python/mod_python/publisher.py Tue Jul 31 15:46:33 2001
***************
*** 168,174 ****
if name not in expected:
del args[name]
! result = apply(object, (), args)
if result:
result = str(result)
--- 168,178 ----
if name not in expected:
del args[name]
! try:
! result = apply(object, (), args)
! except apache.InternalRedirect, e:
! req.internal_redirect(e.uri)
! return apache.OK
if result:
result = str(result)
*** ./lib/python/mod_python/apache.py.orig Tue Jul 31 16:00:17 2001
--- ./lib/python/mod_python/apache.py Tue Jul 31 15:44:16 2001
***************
*** 53,58 ****
--- 53,63 ----
import imp
import types
import _apache
+ import exceptions
+
+ class InternalRedirect (exceptions.Exception):
+ def __init__(self, uri):
+ self.uri = uri
# a small hack to improve PythonPath performance. This
# variable stores the last PythonPath in raw (unevaled) form.
*** ./src/requestobject.c.orig Tue May 22 22:49:43 2001
--- ./src/requestobject.c Tue Jul 31 15:08:21 2001
***************
*** 438,443 ****
--- 438,462 ----
}
/**
+ ** request.internal_redirect(request self, string uri)
+ **
+ * An interface to the ap_internal_redirect function.
+ * Tom Emerson, <tree at basistech.com>, 2001-07-31
+ */
+ static PyObject * req_internal_redirect(requestobject *self, PyObject *args)
+ {
+ char *uri;
+
+ if (! PyArg_ParseTuple(args, "s", &uri))
+ return NULL;
+
+ ap_internal_redirect(uri, self->request_rec);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ /**
** request.get_options(request self)
**
*/
***************
*** 792,797 ****
--- 811,817 ----
{"get_dirs", (PyCFunction) req_get_dirs, METH_VARARGS},
{"get_remote_host", (PyCFunction) req_get_remote_host, METH_VARARGS},
{"get_options", (PyCFunction) req_get_options, METH_VARARGS},
+ {"internal_redirect", (PyCFunction) req_internal_redirect, METH_VARARGS},
{"read", (PyCFunction) req_read, METH_VARARGS},
{"readline", (PyCFunction) req_readline, METH_VARARGS},
{"register_cleanup", (PyCFunction) req_register_cleanup, METH_VARARGS},
-------------- next part --------------
--
Tom Emerson Basis Technology Corp.
Sr. Sinostringologist http://www.basistech.com
"Beware the lollipop of mediocrity: lick it once and you suck forever"
|