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