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')
),
...

Оставьте комментарий