Интеграция загрузки / просмотра S3 с django-tinymce - PullRequest
3 голосов
/ 13 октября 2011

Я искал ресурсы о том, как интегрировать Amazon S3 с TinyMCE.Лучшая ссылка, с которой я столкнулся на данный момент: http://forums.aurigma.com/yaf_postst4033_Amazon-S3-File-Manager-for-TinyMCE-and-CKEditor.aspx

Есть ли у кого-нибудь опыт интеграции этого в приложение Django?Если нет, то какие есть альтернативные решения для редактирования расширенного текста и извлечения изображений из S3?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Я использовал Джанго-хранилища .Работает отлично.

1 голос
/ 05 апреля 2019

Если кто-то искал это недавно, как и я, и ему нужно решение, чтобы заставить django-tinymce4-lite работать с django-хранилищами и django-filebrowser-no-grappelli, мне удалось заставить его работать следующим образом:

1) Следуйте этому превосходному учебнику: https://fosstack.com/how-to-set-up-tinymce-in-django-app/

2) Когда дело доходит до работы части s3, вам необходимо установить django-хранилища и настроить медиасредства, как описано в инструкциях здесь

3) Вам нужно создать подкласс S3Boto3Storage и сделать его своим DEFAULT_FILE_STORAGE, как показано ниже:

DEFAULT_FILE_STORAGE = 'module.containing.MediaStorage'

4) И внутри этого модуля создайте класс MediaStorage со следующим API для работы с FileBrowser

class MediaStorage(S3Boto3Storage):
  location = settings.MEDIAFILES_LOCATION

  def isdir(self, name):
      if not name:  # Empty name is a directory
          return True

      if self.isfile(name):
          return False

      for item in super(MediaStorage, self).listdir(name):
          if len(item):
              return True

      return False

  def isfile(self, name):
      try:
          name = self._normalize_name(self._clean_name(name))
          f = S3Boto3StorageFile(name, 'rb', self)
          if "directory" in f.obj.content_type:
              return False
          return True
      except Exception:
          return False

  def makedirs(self, name):
      name = self._normalize_name(self._clean_name(name))
      return self.bucket.meta.client.put_object(Bucket=self.bucket.name, Key=f'{name}/')

  def rmtree(self, name):
      name = self._normalize_name(self._clean_name(name))
      delete_objects = [{'Key': f"{name}/"}]

      dirlist = self.listdir(self._encode_name(name))
      for item in dirlist:
          for obj in item:
              obj_name = f"{name}/{obj}"
              if self.isdir(obj_name):
                  obj_name = f"{obj_name}/"
              delete_objects.append({'Key': obj_name})
      self.bucket.delete_objects(Delete={'Objects': delete_objects})

  def path(self, name):
      return name

  def listdir(self, name):
      directories, files = super().listdir(name)
      if '.' in files:
          files.remove('.')
      return directories, files

  def exists(self, name):
      if self.isdir(name):
          return True
      else:
          return super().exists(name)

  def get_modified_time(self, name):
      # S3 boto3 library requires that directorys have the trailing slash
      if self.isdir(name):
          name = f'{name}/'
      return super().get_modified_time(name)

  def size(self, name):
      # S3 boto3 library requires that directorys have the trailing slash
      if self.isdir(name):
          name = f'{name}/'
      return super().size(name)

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...