If you’ve tried using Django Compressor in your 500.html error handler you’ve most likely run into an error similar to the following in your logs:
Wed Sep 18 18:04:33 2013] [error] [client 97.115.151.15] OfflineGenerationError: You have offline compression enabled but key "02857b2ef46251c15e3e8648c2ef7a21" is missing from offline manifest. You may need to run "python manage.py compress"., referer: http://www.somesite.com/ |
From the docs… “The default 500 view passes no variables to the 500.html template and is rendered with an empty Context to lessen the chance of additional errors.”
This presents a slight problem if you’re using any type of assets (CSS, images, etc.) in your 500 page as you now have to maintain separate versions just for your 500.html instead of using the ones being generated by Compressor.
The solution is to use a custom class-based view. First, create a new view in your application:
handler500.py
from django.views.generic import TemplateView | |
class Handler500(TemplateView): | |
template_name = '500.html' | |
@classmethod | |
def as_error_view(cls): | |
v = cls.as_view() | |
def view(request): | |
r = v(request) | |
r.render() | |
return r | |
return view | |
# must also override this method to ensure the 500 status code is set | |
def get(self, request, *args, **kwargs): | |
context = self.get_context_data(**kwargs) | |
return self.render_to_response(context, status=500) |
Now tell Django to use it by declaring handler500 in your URLconf:
urls.py
from app.views.handler500 import Handler500 | |
handler500 = Handler500.as_error_view() |
This no longer works unfortuately (tested on django 1.9)