Как прикрепить файл S3 к электронной почте в Django - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь прикрепить медиа-файл, сохраненный в корзине S3, к электронному письму, что я делаю с этой строкой кода:

email.attach_file(standard.download.url)

Модель определяется следующим образом:

class Standard(models.Model):
    name = models.CharField(max_length = 51)
    download = models.FileField(upload_to="standard_downloads/", null=True, blank=True)

    def __str__(self):
        return self.name

В пределах settings.py я определил свои медиа-файлы следующим образом:

AWS_DEFAULT_ACL = 'public-read'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
DEFAULT_FILE_STORAGE = 'sme.storage_backends.MediaStorage'
MEDIA_ROOT = 'https://%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME

При попытке запустить код я получаю

Нет такогофайл или каталог: 'https: /bucket-name.s3.amazonaws.com/media/standard_downloads/filename.ext

Обратите внимание, что он отображается как https:/ (один /). Как мне исправить это?

1 Ответ

2 голосов
/ 09 ноября 2019

Вот исходный код attach_file от Django. Там четко написано - прикрепить файл из файловой системы . Это не работает с удаленными URL. И когда вы даете ему URL-адрес, он думает, что вы ссылаетесь на локальный файл, поэтому он экранирует все двойные косые черты в одиночные косые черты.

def attach_file(self, path, mimetype=None):
    """
    Attach a file from the filesystem.

    Set the mimetype to DEFAULT_ATTACHMENT_MIME_TYPE if it isn't specified
    and cannot be guessed.

    For a text/* mimetype (guessed or specified), decode the file's content
    as UTF-8. If that fails, set the mimetype to
    DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content.
    """
    path = Path(path)
    with path.open('rb') as file:
        content = file.read()
        self.attach(path.name, content, mimetype)

Django не предоставляет ничего встроенного для этого. Вам нужно будет написать что-то нестандартное в строках вышеприведенного кода, используя библиотеки типа request или boto. По сути, идея заключается в том, чтобы извлечь из удаленного URL-адреса сохранение как temp и затем использовать attach.

Вот один пример того, как вы можете получить файл на лету:

from django.core.mail.message import attach
import requests
response = requests.get("http://yoururl/somefile.pdf")
email.attach('My file',response.read(),mimetype="application/pdf")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...