code: def put(self, filename, handle):
          
          if self.config.s3_cache_readonly:
              logger.info('Skipping upload to S3 bucket (using S3 in read only mode).')
          else:
              timer = Timer()
              self.check_prerequisites()
              with PatchedBotoConfig():
                  from boto.s3.key import Key
                  raw_key = self.get_cache_key(filename)
                  logger.info("Uploading distribution archive to S3 bucket: %s", raw_key)
                  key = Key(self.s3_bucket)
                  key.key = raw_key
                  try:
                      key.set_contents_from_file(handle)
                  except Exception as e:
                      logger.info("Encountered error writing to S3 bucket, "
                                  "falling back to read only mode (exception: %s)", e)
                      self.config.s3_cache_readonly = True
                  else:
                      logger.info("Finished uploading distribution archive to S3 bucket in %s.", timer)
docs: Upload a distribution archive to the configured Amazon S3 bucket.
  
          If the :attr:`~.Config.s3_cache_readonly` configuration option is
          enabled this method does nothing.
  
          :param filename: The filename of the distribution archive (a string).
          :param handle: A file-like object that provides access to the
                         distribution archive.
          :raises: :exc:`.CacheBackendError` when any underlying method fails.