title: How can I test binary file uploading with django-rest-framework's test client?
body: <p>I have a Django application with a view that accepts a file to be uploaded. Using the Django REST framework I'm subclassing APIView and implementing the post() method like this:</p>
  
  <pre><code>class FileUpload(APIView):
      permission_classes = (IsAuthenticated,)
  
      def post(self, request, *args, **kwargs):
          try:
              image = request.FILES['image']
              # Image processing here.
              return Response(status=status.HTTP_201_CREATED)
          except KeyError:
              return Response(status=status.HTTP_400_BAD_REQUEST, data={'detail' : 'Expected image.'})
  </code></pre>
  
  <p>Now I'm trying to write a couple of unittests to ensure authentication is required and that an uploaded file is actually processed. </p>
  
  <pre><code>class TestFileUpload(APITestCase):
      def test_that_authentication_is_required(self):
          self.assertEqual(self.client.post('my_url').status_code, status.HTTP_401_UNAUTHORIZED)
  
      def test_file_is_accepted(self):
          self.client.force_authenticate(self.user)
          image = Image.new('RGB', (100, 100))
          tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
          image.save(tmp_file)
          with open(tmp_file.name, 'rb') as data:
              response = self.client.post('my_url', {'image': data}, format='multipart')
              self.assertEqual(status.HTTP_201_CREATED, response.status_code)
  </code></pre>
  
  <p>But this fails when the REST framework attempts to encode the request</p>
  
  <pre><code>Traceback (most recent call last):
    File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-packages/django/utils/encoding.py", line 104, in force_text
      s = six.text_type(s, encoding, errors)
  UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 118: invalid start byte
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "/home/vagrant/webapp/myproject/myapp/tests.py", line 31, in test_that_jpeg_image_is_accepted
      response = self.client.post('my_url', { 'image': data}, format='multipart')
    File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-    packages/rest_framework/test.py", line 76, in post
      return self.generic('POST', path, data, content_type, **extra)
    File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-packages/rest_framework/compat.py", line 470, in generic
      data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET)
    File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-packages/django/utils/encoding.py", line 73, in smart_text
      return force_text(s, encoding, strings_only, errors)
    File "/home/vagrant/.virtualenvs/myapp/lib/python3.3/site-packages/django/utils/encoding.py", line 116, in force_text
      raise DjangoUnicodeDecodeError(s, *e.args)
  django.utils.encoding.DjangoUnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 118: invalid start byte. You passed in b'--BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="image"; filename="tmpyz2wac.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff[binary data omitted]' (&lt;class 'bytes'&gt;)
  </code></pre>
  
  <p>How can I make the test client send the data without attempting to decode it as UTF-8?</p>