modpythoncustom was needed for Django operation
This commit is contained in:
		
							parent
							
								
									38cabe7ba3
								
							
						
					
					
						commit
						9f50eeb52c
					
				
					 1 changed files with 102 additions and 0 deletions
				
			
		
							
								
								
									
										102
									
								
								www/modpythoncustom.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								www/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…
	
	Add table
		
		Reference in a new issue
	
	 Bradley M. Kuhn
						Bradley M. Kuhn