Настройка типа Mimetype при использовании TemplateView в Django
Знает ли anyboy, как установить желаемый тип mimetype при использовании TemplateView, как в:
urlpatterns = patterns('',
url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html')),
В этом случае я хочу установить mimtype как "text/plain"
Ответы
Ответ 1
Для Django >= 1.5
TemplateView принимает аргумент content_type.
Пример копирования из @Meilo
urlpatterns = patterns('',
url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html', content_type='text/plain')),
Для Django < 1.5
Я думаю, что просто вызов TemplateView.as_view() невозможен, но, возможно, я пропустил его (из источника),
но вы можете сделать свой собственный класс
class TextTemplateView(TemplateView):
def render_to_response(self, context, **response_kwargs):
response_kwargs['content_type'] = 'text/plain'
return super(TemplateView, self).render_to_response(context, **response_kwargs)
Вы можете взглянуть на:
django.template.response = > TemplateResponse
django.views.generic.base = > TemplateView
И если вам нужно что-то более динамичное:
from django.utils.decorators import classonlymethod
class ContentTypeTemplateView(TemplateView):
@classonlymethod
def as_view(cls, content_type='text/plain', **initargs):
setattr(cls, 'content_type', content_type)
return super(ContentTypeTemplateView, cls).as_view(**initargs)
def render_to_response(self, context, **response_kwargs):
response_kwargs['content_type'] = self.content_type
return super(ContentTypeTemplateView, self).render_to_response(context, **response_kwargs)
urlpatterns = patterns('',
url(r'^$', ContentTypeTemplateView.as_view(content_type='text/plain',
template_name='staticpages/test.html'),
name='index'),
)
Использование Mixin
from django.core.exceptions import ImproperlyConfigured
class ContentTypeMixin(object):
content_type = None
def render_to_response(self, context, **response_kwargs):
if not self.content_type:
raise ImproperlyConfigured(
"MimeTypeMixin rquires a definition of content_type")
response_kwargs['content_type'] = self.content_type
return super(ContentTypeMixin, self).render_to_response(context,
**response_kwargs)
class MyTxtView(ContentTypeMixin, TemplateView):
content_type = 'text/plain'
....
Ответ 2
В Django 1.5 аргумент content_type в TemplateView добавляет те же функции, что и в представлении на основе функций. Это облегчает установку желаемого типа изображения:
urlpatterns = patterns('',
url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html', content_type='text/plain')),
Ответ 3
Я знаю, что вы просите установить тип контента с помощью TemplateView, но я дам вам другой ответ, который, я думаю, будет более чистым и может быть использован в версиях Django ниже 1.5.
url(r'^robots\.txt$', 'django.shortcuts.render', kwargs={
'template_name': 'robots.txt',
'content_type': 'text/plain',
})
При таком подходе вам не нужно ничего импортировать или подклассом TemplateView
и делать уродливые перезаписи некоторых методов. Вы можете просто использовать старый метод с функциями, основанными на представлениях.
Ответ 4
Лучший способ сделать это - подкласс TemplateView
и переопределить метод render_to_response()
:
class StaticPagesTest(TemplateView):
template_name = 'staticpages/test.html'
def render_to_response(self, context, **kwargs):
return super(StaticPagesTest, self).render_to_response(context,
mimetype='text/plain', **kwargs)
Ответ 5
Если вы не хотите расширять TemplateView, вы можете расширить TemplateResponse, чтобы установить тип mimetype:
from django.template.response import TemplateResponse
class TextResponse(TemplateResponse):
def __init__(self, *args, **kwargs):
kwargs['mimetype'] = 'text/plain'
return super(TextResponse, self).__init__(*args, **kwargs)
Затем передайте его как template_class в TemplateView
urlpatterns = patterns('django.views.generic.simple',
(r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt', response_class=TextResponse)),
)
Ответ 6
Я знаю, что это решение для 1.5, но приложение, в котором я работаю, - 1.4.
У меня была проблема с двумя шаблонами url в строке, используя ответ sacabuche:
url(r'^playlist1\.m3u$', ContentTypeTemplateView.as_view(template_name='playlist1.m3u', content_type='audio/x-mpegurl')),
url(r'^playlist2\.pls$', ContentTypeTemplateView.as_view(template_name='playlist2.pls', content_type='audio/x-scpls'))
Я нашел, что playlist1 вернет правильный шаблон, но с типом контента playlist2! Playlist2 был в порядке. Добавление 3-го шаблона url с типом содержимого 'foo' приведет к возврату всех просмотров плейлистов с типом содержимого 'foo'.
В итоге я использовал метод рендеринга с хорошими результатами:
URLs:
url(r'^playlist1\.m3u$', 'content_type_to_template', {'template_name': 'playlist1.m3u', 'content_type': 'audio/x-mpegurl'}),
url(r'^playlist2\.pls$', 'content_type_to_template', {'template_name': 'playlist2.pls', 'content_type':'audio/x-scpls'})
Просмотры:
from django.shortcuts import render
def content_type_to_template(request, template_name='', content_type='text/plain'):
return render(request, template_name, content_type=content_type)
Ответ 7
url(r'^test/(?P<template>.*)', lambda request, template: TemplateView.as_view(template_name=template)(request)),