title: "I/O operation on closed file" with StringIO in Django view test
body: <p>I inherited the following Django view code, used by another webservice to serve downloadable versions of output data:</p>
  
  <pre><code>def index(request):
      # ... (snip) ...
      data = base64.decodestring(request.POST['data'])
      filename = request.POST['filename']
  
      wrapper = FileWrapper(StringIO(data))
  
      response = HttpResponse(wrapper, content_type=guess_type(str(filename))[0])
  
      response['Content-Length'] = len(data)
      response['Content-Disposition'] = "attachment; filename=" + filename
  
      return response
  </code></pre>
  
  <p>The function itself — written against Django 1.0 — still works fine after upgrading to 1.5. Unfortunately, the test that covers this view is now failing:</p>
  
  <pre><code>    def testDownload(self):
          self.client.login(username='test', password='test')
  
          real = 'abc' * 100
          data = base64.encodestring(real)
          response = self.client.post("/api/v1/download/", {'data': data, 'filename': 'out.jpg'})
  
          self.assertEqual(real, response.content)
          self.assertEqual(response['Content-Disposition'], 'attachment; filename=out.jpg')
  </code></pre>
  
  <p>and the error:</p>
  
  <pre><code>Traceback (most recent call last):
    File "/home/fred/.secret_projects/final/gerbils/tests/amf.py", line 548, in testDownload
      self.assertEqual(real, response.content)
    File "/home/fred/.virtualenvs/cunning_plot/lib/python2.7/site-packages/django/http/response.py", line 282, in content
      self._consume_content()
    File "/home/carl/.virtualenvs/cunning_plot/lib/python2.7/site-packages/django/http/response.py", line 278, in _consume_content
      self.content = b''.join(self.make_bytes(e) for e in self._container)
    File "/home/carl/.virtualenvs/cunning_plot/lib/python2.7/site-packages/django/http/response.py", line 278, in &lt;genexpr&gt;
      self.content = b''.join(self.make_bytes(e) for e in self._container)
    File "/usr/lib64/python2.7/wsgiref/util.py", line 30, in next
      data = self.filelike.read(self.blksize)
    File "/usr/lib64/python2.7/StringIO.py", line 127, in read
      _complain_ifclosed(self.closed)
    File "/usr/lib64/python2.7/StringIO.py", line 40, in _complain_ifclosed
      raise ValueError, "I/O operation on closed file"
  ValueError: I/O operation on closed file
  </code></pre>
  
  <p>So.. any ideas? I can't see anything in <code>testDownload()</code> or <code>index()</code> which would necessarily "close" the <code>StringIO</code> before it needs to be read. And if there were something, wouldn't it affect the non-test situation as well?</p>
  
  <p>Very confused. Help appreciated.</p>