Django - 用户在视图中上传 S3 文件
Django - User uploaded S3 files in the view
我有一个页面,用户可以在其中将 PDF/图像文件上传到他们的个人资料。这些文件的模型相对简单:
class ResumeItemFile(models.Model):
item = models.ForeignKey(ResumeItem, related_name='attachment_files')
file = models.FileField(
max_length=255, upload_to=RandomizedFilePath('resume_attachments'),
verbose_name=_('Attachment'))
name = models.CharField(max_length=255, verbose_name=_('Naam'), blank=True)
我正在创建一个视图,其中链接到配置文件 (item
) 的所有文件都收集在一个 .zip 文件中。我已经在本地工作了,但在生产中我 运行 出现以下错误 NotImplementedError: This backend doesn't support absolute paths.
主要区别在于在制作时媒体文件是通过 S3 提供的
MEDIA_URL = 'https://******.s3.amazonaws.com/'
STATIC_URL = MEDIA_URL
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
在我看来,我在 attachments
变量中创建了一个 ResumeItemFile 列表,它是一个字典列表,如下所示:{'filename', ResumeItemFileObject}
for file in attachments:
storage = DefaultStorage()
filename = file[1]
file_extension = str(file[0].file).split('.')[-1]
file_object = storage.open(file[0].file.path, mode='rb')
filename, file_object.read())
file_object.close()
虽然这在本地运行良好,但在暂存时它会在 file_object = storage.open(file[0].file.path, mode='rb')
行崩溃。
如果后端不支持绝对路径,我如何select正确的文件?有人知道我做错了什么吗?
我认为这个问题是因为在 s3boto 存储 class 中,没有实现 path() 方法。根据 Django 文档,
For storage systems that aren’t accessible from the local filesystem,
this will raise NotImplementedError instead.
在您的代码中使用 file.name
而不是 file.path
。
# file_object = storage.open(file[0].file.path, mode='rb')
file_object = storage.open(file[0].file.name, mode='rb')
您可能需要查看 File
对象。它允许您以主要 Pythonic 方式操作文件,但利用了 Django 项目的存储设置。就我而言,这允许我在本地使用本地磁盘存储,并在生产中使用 S3:
https://docs.djangoproject.com/en/2.0/ref/files/file/
这将抽象出您正在编写的许多样板文件。这里有一个例子:
https://docs.djangoproject.com/en/2.0/topics/files/#the-file-object
祝你好运!
我有一个页面,用户可以在其中将 PDF/图像文件上传到他们的个人资料。这些文件的模型相对简单:
class ResumeItemFile(models.Model):
item = models.ForeignKey(ResumeItem, related_name='attachment_files')
file = models.FileField(
max_length=255, upload_to=RandomizedFilePath('resume_attachments'),
verbose_name=_('Attachment'))
name = models.CharField(max_length=255, verbose_name=_('Naam'), blank=True)
我正在创建一个视图,其中链接到配置文件 (item
) 的所有文件都收集在一个 .zip 文件中。我已经在本地工作了,但在生产中我 运行 出现以下错误 NotImplementedError: This backend doesn't support absolute paths.
主要区别在于在制作时媒体文件是通过 S3 提供的
MEDIA_URL = 'https://******.s3.amazonaws.com/'
STATIC_URL = MEDIA_URL
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
在我看来,我在 attachments
变量中创建了一个 ResumeItemFile 列表,它是一个字典列表,如下所示:{'filename', ResumeItemFileObject}
for file in attachments:
storage = DefaultStorage()
filename = file[1]
file_extension = str(file[0].file).split('.')[-1]
file_object = storage.open(file[0].file.path, mode='rb')
filename, file_object.read())
file_object.close()
虽然这在本地运行良好,但在暂存时它会在 file_object = storage.open(file[0].file.path, mode='rb')
行崩溃。
如果后端不支持绝对路径,我如何select正确的文件?有人知道我做错了什么吗?
我认为这个问题是因为在 s3boto 存储 class 中,没有实现 path() 方法。根据 Django 文档,
For storage systems that aren’t accessible from the local filesystem, this will raise NotImplementedError instead.
在您的代码中使用 file.name
而不是 file.path
。
# file_object = storage.open(file[0].file.path, mode='rb')
file_object = storage.open(file[0].file.name, mode='rb')
您可能需要查看 File
对象。它允许您以主要 Pythonic 方式操作文件,但利用了 Django 项目的存储设置。就我而言,这允许我在本地使用本地磁盘存储,并在生产中使用 S3:
https://docs.djangoproject.com/en/2.0/ref/files/file/
这将抽象出您正在编写的许多样板文件。这里有一个例子:
https://docs.djangoproject.com/en/2.0/topics/files/#the-file-object
祝你好运!