Django и TEMPLATE_CONTEXT_PROCESSORS

Начиная с Django 1.3, переменная TEMPLATE_CONTEXT_PROCESSORS отсутствует в модуле settings. Чтобы добавить свои контекстные процессоры к существующим по-умолчанию — пишем:


from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
...
TEMPLATE_CONTEXT_PROCESSORS += (
    ...
)

И не забываем ставить хвостовую запятую, если в кортеже только один элемент.

robots.txt и class-based generic views в Django

В свое время мне, как не очень искушенному разработчику на Django, было совсем не очевидно как обеспечить отдачу статичного текстового файла. Примером такого файла может быть robots.txt или файлы верификации, часто требующиеся для подтверждения владения сайтом на разнообразных сервисах. При этом, мне бы хотелось, чтобы файл лежал на диске в директории с шаблонами и механизм его отдачи не требовал большого количества кода. Решение было найдено на просторах сети и заключалось в использовании обобщенных представлений (Generic Views) Django. Абстрагируя общеупотребительные идиомы и шаблоны проектирования, обобщенные представления позволяют быстро создавать типичные представления данных с минимумом кода.

Конкретно в данном случае нам может помочь direct_to_template. Для этого в urls.py в соответствующие места добавляем:

...
from django.views.generic.simple import direct_to_template
...
url(
    r'^robots\.txt$',
    render,
    {'template': 'robots.txt','mimetype': 'text/plain'}
),
...

Но с версии 1.3 разработчики Django решили перейти от обобщенных представлений на основе функций (function-based generic views) к обобщенным представлениям на основе классов (class-based generic views). Так что теперь вместо direct_to_template следует использовать TemplateView.as_view(). Но тут возникает небольшая проблема — обобщенные представления на основе классов не поддерживают параметр mimetype. Разработчики сами предлагают решение — отнаследоваться от TemplateView и переопределить метод render_to_response:

...
from django.views.generic.base import TemplateView

class PlainTextTemplateView(TemplateView):
    def render_to_response(self, context, **kwargs):
        return super(PlainTextTemplateView, self).render_to_response(
            context,
            content_type='text/plain',
            **kwargs
        )
...
url(
    r'^robots\.txt$',
    PlainTextTemplateView.as_view(template_name='robots.txt')
),
...