【问题标题】:Setting up Mimetype when using TemplateView in Django在 Django 中使用 TemplateView 时设置 Mimetype
【发布时间】:2011-10-15 14:21:35
【问题描述】:

有没有人知道我在使用 TemplateView 时如何设置所需的 mimetype,如:

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

在这种情况下,我想将 mimtype 设置为“text/plain”

【问题讨论】:

    标签: django django-templates


    【解决方案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

    我认为仅调用 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 => 模板响应
    django.views.generic.base => 模板视图

    如果你需要更动态的东西:

    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 中,TemplateView 中的 content_type 参数添加了与之前基于函数的视图中相同的功能。这样可以更轻松地设置所需的 mimetype:

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

    【讨论】:

      【解决方案3】:

      我知道您要求使用 TemplateView 设置内容类型,但我会给您不同的答案,我认为这会更干净,并且可以在低于 1.5 的 Django 版本中使用。

          url(r'^robots\.txt$', 'django.shortcuts.render', kwargs={
              'template_name': 'robots.txt',
              'content_type': 'text/plain',
          })
      

      使用这种方法,您不需要导入任何东西或子类TemplateView 并且对某些方法进行丑陋的覆盖。您可以简单地将旧技术与基于函数的视图一起使用。

      【讨论】:

        【解决方案4】:

        如果不想扩展 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)),
        )
        

        【讨论】:

          【解决方案5】:

          最好的方法是继承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)
          

          【讨论】:

          • Sacabuche 有更完整的答案。
          【解决方案6】:

          我知道 1.5 解决了这个问题,但我正在使用的应用程序是 1.4。

          我在使用 sacabuche 的回答时遇到了连续两个 url 模式的问题:

          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 的内容类型!播放列表 2 没问题。添加内容类型为“foo”的第三个 url 模式将导致所有播放列表视图返回内容类型为“foo”。

          我最终改用了 render 方法,结果很好:

          网址:

          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】:

            如何更改 TemplateView 的内容类型的简单示例:

            #views.py
            from django.views.generic import TemplateView
            
            class HomeView(TemplateView):
                template_name = "home/index.html"
                content_type = 'text/html'
            
            # urls.py
            url(r'^home/$', HomeView.as_view(), name='home_page'),
            

            【讨论】:

              【解决方案8】:
              url(r'^test/(?P<template>.*)', lambda request, template: TemplateView.as_view(template_name=template)(request)),
              

              【讨论】:

                猜你喜欢
                • 2015-11-22
                • 2011-03-07
                • 2019-01-02
                • 2011-12-23
                • 2018-03-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-10-09
                相关资源
                最近更新 更多