From e33ff5d34d1ceba8a6e50e2355d4dd6850e9382c Mon Sep 17 00:00:00 2001 From: jordij Date: Fri, 10 Apr 2015 15:44:41 +1200 Subject: [PATCH] documents served using django-sendfile --- setup.py | 1 + tox.ini | 1 + wagtail/tests/settings.py | 3 +++ wagtail/wagtaildocs/tests.py | 3 +++ wagtail/wagtaildocs/views/serve.py | 17 ++--------------- 5 files changed, 10 insertions(+), 15 deletions(-) diff --git a/setup.py b/setup.py index a44d564e3b..d0c29d9beb 100644 --- a/setup.py +++ b/setup.py @@ -34,6 +34,7 @@ install_requires = [ "django-modelcluster>=0.6", "django-taggit>=0.13.0", "django-treebeard==3.0", + "django-sendfile==0.3.6", "Pillow>=2.6.1", "beautifulsoup4>=4.3.2", "html5lib==0.999", diff --git a/tox.ini b/tox.ini index d0d1078962..53993ef7db 100644 --- a/tox.ini +++ b/tox.ini @@ -23,6 +23,7 @@ deps = django-modelcluster>=0.6 django-taggit==0.13.0 django-treebeard==3.0 + django-sendfile==0.3.6 Pillow>=2.3.0 beautifulsoup4>=4.3.2 html5lib==0.999 diff --git a/wagtail/tests/settings.py b/wagtail/tests/settings.py index 6bbe14e561..70268d82cd 100644 --- a/wagtail/tests/settings.py +++ b/wagtail/tests/settings.py @@ -83,6 +83,7 @@ INSTALLED_APPS = ( 'taggit', 'compressor', + 'sendfile', 'wagtail.wagtailcore', 'wagtail.wagtailadmin', @@ -157,5 +158,7 @@ try: except ImportError: pass +# Sendfile dev backend, do NOT use in production https://github.com/johnsensible/django-sendfile#django-sendfile +SENDFILE_BACKEND = 'sendfile.backends.development' WAGTAIL_SITE_NAME = "Test Site" diff --git a/wagtail/wagtaildocs/tests.py b/wagtail/wagtaildocs/tests.py index ecde7fa096..68b186537c 100644 --- a/wagtail/wagtaildocs/tests.py +++ b/wagtail/wagtaildocs/tests.py @@ -556,6 +556,9 @@ class TestServeView(TestCase): def test_content_length_header(self): self.assertEqual(self.get()['Content-Length'], '25') + def test_content_type_header(self): + self.assertEqual(self.get()['Content-Type'], 'application/msword') + def test_is_streaming_response(self): self.assertTrue(self.get().streaming) diff --git a/wagtail/wagtaildocs/views/serve.py b/wagtail/wagtaildocs/views/serve.py index 4bd8d45569..9155116710 100644 --- a/wagtail/wagtaildocs/views/serve.py +++ b/wagtail/wagtaildocs/views/serve.py @@ -1,27 +1,14 @@ from django.shortcuts import get_object_or_404 -from wsgiref.util import FileWrapper -from django.http import StreamingHttpResponse, BadHeaderError -from unidecode import unidecode +from sendfile import sendfile from wagtail.wagtaildocs.models import Document, document_served def serve(request, document_id, document_filename): doc = get_object_or_404(Document, id=document_id) - wrapper = FileWrapper(doc.file) - response = StreamingHttpResponse(wrapper, content_type='application/octet-stream') - - try: - response['Content-Disposition'] = 'attachment; filename=%s' % doc.filename - except BadHeaderError: - # Unicode filenames can fail on Django <1.8, Python 2 due to - # https://code.djangoproject.com/ticket/20889 - try with an ASCIIfied version of the name - response['Content-Disposition'] = 'attachment; filename=%s' % unidecode(doc.filename) - - response['Content-Length'] = doc.file.size # Send document_served signal document_served.send(sender=Document, instance=doc, request=request) - return response + return sendfile(request, doc.file.path, attachment=True, attachment_filename=doc.filename)