Added modpythoncustom as used by SFLC and Conservancy.
This commit is contained in:
parent
92a40f1aaa
commit
d54550da43
1 changed files with 102 additions and 0 deletions
102
modpythoncustom.py
Normal file
102
modpythoncustom.py
Normal file
|
@ -0,0 +1,102 @@
|
|||
from mod_python import apache
|
||||
|
||||
# 404 should do NOTHING so apache can handle it. This view is referenced
|
||||
# in sflc.urls
|
||||
def view404(request):
|
||||
from django.http import HttpResponseNotFound
|
||||
return HttpResponseNotFound("")
|
||||
|
||||
def outputfilter(filter):
|
||||
# set appropriate cache timeout
|
||||
filter.req.headers_out["Cache-Control"] = "max-age=600"
|
||||
|
||||
# read raw template
|
||||
raw = []
|
||||
s = filter.read()
|
||||
while s:
|
||||
raw.append(s)
|
||||
s = filter.read()
|
||||
raw = "".join(raw)
|
||||
|
||||
# render it
|
||||
from django.template import Context, Template
|
||||
t = Template(raw.decode('utf-8'))
|
||||
del raw
|
||||
cooked = t.render(Context())
|
||||
del t
|
||||
|
||||
# send it off!
|
||||
filter.write(cooked.encode('utf-8'))
|
||||
if s is None:
|
||||
filter.close()
|
||||
|
||||
# This is unreferenced from this file, but it must be imported to
|
||||
# enable template inheritance in the outputfilter!
|
||||
import django.template.loader
|
||||
|
||||
# And now we override a few things in the module
|
||||
# django.core.handlers.modpython
|
||||
|
||||
from django.core.handlers.modpython import *
|
||||
del handler
|
||||
|
||||
class ModPythonRequest(ModPythonRequest):
|
||||
def is_secure(self):
|
||||
return self._req.get_options().has_key('HTTPS') and self._req.get_options()['HTTPS'] == 'on'
|
||||
|
||||
class ModPythonHandler(BaseHandler):
|
||||
request_class = ModPythonRequest
|
||||
|
||||
def __call__(self, req):
|
||||
# mod_python fakes the environ, and thus doesn't process SetEnv. This fixes that
|
||||
# (SFLC instance doesn't call this)
|
||||
#os.environ.update(req.subprocess_env)
|
||||
|
||||
# now that the environ works we can see the correct settings, so imports
|
||||
# requesthat use settings now can work
|
||||
from django.conf import settings
|
||||
|
||||
# if we need to set up middleware, now that settings works we can do it now.
|
||||
if self._request_middleware is None:
|
||||
self.load_middleware()
|
||||
|
||||
set_script_prefix(req.get_options().get('django.root', ''))
|
||||
signals.request_started.send(sender=self.__class__)
|
||||
try:
|
||||
try:
|
||||
request = self.request_class(req)
|
||||
except UnicodeDecodeError:
|
||||
response = http.HttpResponseBadRequest()
|
||||
else:
|
||||
response = self.get_response(request)
|
||||
|
||||
# Apply response middleware
|
||||
for middleware_method in self._response_middleware:
|
||||
response = middleware_method(request, response)
|
||||
response = self.apply_response_fixes(request, response)
|
||||
finally:
|
||||
signals.request_finished.send(sender=self.__class__)
|
||||
|
||||
# SFLC: decline so apache can serve a static file
|
||||
if response.status_code == 404:
|
||||
return apache.DECLINED
|
||||
|
||||
# Convert our custom HttpResponse object back into the mod_python req.
|
||||
req.content_type = response['Content-Type']
|
||||
for key, value in response.items():
|
||||
if key != 'content-type':
|
||||
req.headers_out[str(key)] = str(value)
|
||||
for c in response.cookies.values():
|
||||
req.headers_out.add('Set-Cookie', c.output(header=''))
|
||||
req.status = response.status_code
|
||||
try:
|
||||
for chunk in response:
|
||||
req.write(chunk)
|
||||
finally:
|
||||
response.close()
|
||||
|
||||
return apache.DONE # skip all remaining phases (sf[l]c customization)
|
||||
|
||||
def postreadrequesthandler(req):
|
||||
# mod_python hooks into this function.
|
||||
return ModPythonHandler()(req)
|
Loading…
Reference in a new issue