События изображений в Django-редакторе Froala

Я использую Froala Django Editor в некоторых формах в моем бэкенде Django REST Framework, например, в этой

# resources/forms.py
from django import forms
from froala_editor.widgets import FroalaEditor
from .models import Resource


class ResourceForm(forms.ModelForm):
    class Meta:
        model = Resource
        fields = '__all__'
        widgets = {
            'content': FroalaEditor(
                options={
                    'heightMin': 256
                }
            )
        }

Когда я пытаюсь загрузить изображение (или видео, или любой файл, но по одному) в редакторе Froala, я получаю ошибку: enter image description here

В консоли у меня есть:

GET https://{some-id}.cloudfront.net/uploads/froala_editor/images/Nights.of.Cabiria.jpg   [HTTP/2 403 Forbidden 15ms]

Ошибка выше заставила меня задуматься о том, что, возможно, изображение загружается правильно, но редактор Froala не может получить его после загрузки, чтобы отобразить.

Приложение размещается на AWS, а загруженные файлы хранятся в ведрах S3.
И на самом деле, я проверил в S3 dashboard, и изображения там, так что они загружены правильно.
Несмотря на то, что я использую все стандартные FROALA_EDITOR_OPTIONS. Я знаю, что есть специфические опции для хранения S3 (я пробовал их), но я не использую их, и все загружается нормально.

Все еще глядя на эту ошибку, я вспомнил, что в других моделях в проекте у меня есть ImageFields, например

# users/models.py
class User(AbstractUser):
    name = models.CharField(_('First name'), db_index=True, max_length=255)
    image = models.ImageField(upload_to=user_image_bucket, verbose_name=_('Image'))

    def signed_image_url(self):
        try:
            return sign_cloudfront_url(self.image.url)
        except ValueError:
            return None

и что сериализаторы для этих моделей всегда возвращают подписанный url, а не исходный url изображения

# users/serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            'id',
            'name',
            'signed_image_url',
        )

Я мало что понимаю в AWS S3, но предполагаю, что хранящиеся там изображения не являются общедоступными, и предоставление подписанного url к изображению дает доступ к нему.

Зная это, я полагаю, что мне нужно применить ту же функцию sign_cloudfront_url к изображениям, загруженным через Froala Editor.

Согласно Froala docs, вы можете установить некоторые слушатели событий на опции Froala Editor, такие как image.uploaded, и я думаю, что здесь я должен получить url загруженного изображения и вернуть подписанный url, но я не могу установить эти события.

Если я сделаю это:

# resources/forms.py
from django import forms
from froala_editor.widgets import FroalaEditor
from .models import Resource


class ResourceForm(forms.ModelForm):
    class Meta:
        model = Resource
        fields = '__all__'

        def uploaded():
            print("hello world")

        widgets = {
            'content': FroalaEditor(
                options={
                    'heightMin': 256,
                    'events': {
                        'image.uploaded': uploaded,
                    }
                }
            )
        }

Я получаю вполне ожидаемую Object of type function is not JSON serializable ошибку.

Есть идеи, как мне с этим справиться?

Вернуться на верх