簡體   English   中英

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.此后端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')行上崩潰。

如果后端不支持絕對路徑,我該如何選擇正確的文件? 有人知道我在做什么錯嗎?

我認為出現此問題是因為在s3boto存儲類中,未實現path()方法。 根據Django文檔,

對於無法從本地文件系統訪問的存儲系統,這將引發NotImplementedError。

在代碼中使用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對象。 它允許您以很大程度上Python的方式操作文件,但可以利用Django項目的存儲設置。 就我而言,這使我可以在本地使用本地磁盤存儲以及在生產環境中使用S3:

https://docs.djangoproject.com/zh-CN/2.0/ref/files/file/

這將抽象出您正在編寫的許多樣板。 這里有一個例子:

https://docs.djangoproject.com/zh-CN/2.0/topics/files/#the-file-object

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM