Python django存储与S3:TypeError:bytes-like对象是必需的,而不是';str';

Python django存储与S3:TypeError:bytes-like对象是必需的,而不是';str';,python,django,amazon-s3,boto3,python-django-storages,Python,Django,Amazon S3,Boto3,Python Django Storages,我有一个将CSV导出到S3的函数: def导出\u csv(报告id): #MyModel有一个名为“json\u data”的JsonField` items=MyModel.objects.all() data=[x.json_项目中x的数据] df=pd.DataFrame(数据) 文件\u buffer=io.StringIO() #全部报价,以避免分离器脱落 df.to_csv( 文件缓冲区, 索引=假, 编码='utf-8', quotechar=“”, quoting=csv.QU

我有一个将CSV导出到S3的函数:

def导出\u csv(报告id):
#MyModel有一个名为“json\u data”的JsonField`
items=MyModel.objects.all()
data=[x.json_项目中x的数据]
df=pd.DataFrame(数据)
文件\u buffer=io.StringIO()
#全部报价,以避免分离器脱落
df.to_csv(
文件缓冲区,
索引=假,
编码='utf-8',
quotechar=“”,
quoting=csv.QUOTE“所有,
)
report.report\u data\u file.save(
“data.csv”,ContentFile(文件\u buffer.getvalue())
)
我正在使用以下字段:

class PrivateMediaStorage(S3boto3存储):
位置=settings.AWS\u PRIVATE\u MEDIA\u位置
默认值_acl='private'
文件覆盖=False
自定义域=False
课堂报告(基本模型):
...
报告\数据\文件=models.FileField(
存储=私有媒体存储(),
上传到=导出位置,
空=真,
空白=真,
)
这在我的本地环境中运行良好,
PrivateMediaStorage
被定义为

class PrivateMediaStorage(文件系统存储):
通过
在生产中,我使用的是
django存储
,在运行此功能时,我看到以下错误:

TypeError: a bytes-like object is required, not 'str'
以下是完整的回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/celery/app/trace.py", line 385, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/celery/app/trace.py", line 650, in __protected_call__
    return self.run(*args, **kwargs)
  File "/code/apps/benchmark/tasks.py", line 45, in export_report_data_task
    report.export_json_data()
  File "/code/apps/benchmark/models.py", line 470, in export_json_data
    export_csv(self.id)
  File "/code/apps/benchmark/utils/export_report_data.py", line 46, in export_csv
    report.report_data_file.save(
  File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/files.py", line 87, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "/usr/local/lib/python3.8/site-packages/django/core/files/storage.py", line 52, in save
    return self._save(name, content)
  File "/usr/local/lib/python3.8/site-packages/storages/backends/s3boto3.py", line 495, in _save
    self._save_content(obj, content, parameters=parameters)
  File "/usr/local/lib/python3.8/site-packages/storages/backends/s3boto3.py", line 510, in _save_content
    obj.upload_fileobj(content, ExtraArgs=put_parameters)
  File "/usr/local/lib/python3.8/site-packages/boto3/s3/inject.py", line 619, in object_upload_fileobj
    return self.meta.client.upload_fileobj(
  File "/usr/local/lib/python3.8/site-packages/boto3/s3/inject.py", line 539, in upload_fileobj
    return future.result()
  File "/usr/local/lib/python3.8/site-packages/s3transfer/futures.py", line 106, in result
    return self._coordinator.result()
  File "/usr/local/lib/python3.8/site-packages/s3transfer/futures.py", line 265, in result
    raise self._exception
  File "/usr/local/lib/python3.8/site-packages/s3transfer/tasks.py", line 255, in _main
    self._submit(transfer_future=transfer_future, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/s3transfer/upload.py", line 558, in _submit
    self._submit_multipart_request(
  File "/usr/local/lib/python3.8/site-packages/s3transfer/upload.py", line 622, in _submit_multipart_request
    for part_number, fileobj in part_iterator:
  File "/usr/local/lib/python3.8/site-packages/s3transfer/upload.py", line 270, in yield_upload_part_bodies
    fileobj, full_size = self._get_upload_part_fileobj_with_full_size(
  File "/usr/local/lib/python3.8/site-packages/s3transfer/upload.py", line 343, in _get_upload_part_fileobj_with_full_size
    return six.BytesIO(data), len(data)
TypeError: a bytes-like object is required, not 'str'

在这个过程中,错误是在什么时候抛出的?你有可能发布更多的回溯吗?@Asher我用完整的回溯更新了这个问题。我相信错误是在
报告中抛出的。报告数据文件。保存
功能不确定。我有一个非常类似的解决方案,在生产中使用pandas和django stor不同之处在于,由于业务需要,我必须先写入tmp文件,然后将tmp文件推送到S3存储桶,而不是文件对象,这意味着我可以使用文件的路径。好的,谢谢@Asher。如果我不能直接从内存读取tmp文件,我想我可以尝试写入。奇怪的是,我无法写入tmp文件他在本地文件,但不是S3。出于好奇,您是否尝试过在缓冲区周围传递不同的包装器?例如,只传递直接的文件缓冲区,或者在文件对象中包装而不是内容文件?理论上,这不会有什么区别……但是……在过程中的什么时候抛出错误?您是否有可能发布更多错误回溯?@Asher我用完整的回溯更新了这个问题。我相信这个错误是在
报告。报告\u数据\u文件。保存
功能中抛出的。我不确定。我有一个非常类似的解决方案,在生产中使用pandas和django存储。不同的是,由于业务需求,我必须首先写入tmp文件我将tmp文件推送到S3存储桶,而不是文件对象,这意味着我可以使用文件的路径。好的,谢谢@Asher,如果我不能直接从内存中读取tmp文件,我想我可以尝试编写一个tmp文件。我很奇怪,我可以在本地写入文件,但不能写入S3。出于好奇,你是否尝试过在一个存储空间中传递不同的包装器环绕缓冲区?例如,只是传递直接的文件缓冲区,或将文件对象包装成文件对象而不是内容文件?理论上,这不会有什么区别……但是。。。