If you write a template context processor but return the wrong type, for example None
by missing the return statement:
def data(request):
data = {"something": True}
Then currently the error message is very mysterious:
Internal Server Error: /
Traceback (most recent call last):
...
File "/..../site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/..../site-packages/django/template/base.py", line 173, in render
with context.bind_template(self):
File "/.../lib/python3.11/contextlib.py", line 137, in __enter__
return next(self.gen)
^^^^^^^^^^^^^^
File "/..../site-packages/django/template/context.py", line 254, in bind_template
updates.update(processor(self.request))
TypeError: 'NoneType' object is not iterable
If a view returns the wrong type, Django raises a nice error message:
The view example.views.index didn't return an HttpResponse object. It returned None instead.
I suggest we do the same for context processors. If we use try/except around the updates.update()
line, it will not slow down normal processing any noticeable amount, thanks to Python 3.11's “zero-cost” exception handling: https://docs.python.org/3.11/whatsnew/3.11.html#misc
Thanks Adam, good idea 👍
I've taken a stab, left it as a TypeError but just improved the message. I'm not sure about the "It returned <blah> instead." part. With templates the "None" is hardcoded as it's a literal None check. For this I'm not sure what the best way to generalise the return value/type in English is 😁. If you have any ideas I'm open.
And as I write this the ever so quick felixx has already started reviewing though so it may all get resolved by the time you read this 🤣