Подтвердить что ты не робот

Настройка типа Mimetype при использовании TemplateView в Django

Знает ли anyboy, как установить желаемый тип mimetype при использовании TemplateView, как в:

urlpatterns = patterns('',
    url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html')),

В этом случае я хочу установить mimtype как "text/plain"

4b9b3361

Ответ 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)),