События изображений в 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, я получаю ошибку:
В консоли у меня есть:
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 (я пробовал их), но я не использую их, и все загружается нормально.
Все еще глядя на эту ошибку, я вспомнил, что в других моделях в проекте у меня есть ImageField
s, например
# 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
ошибку.
Есть идеи, как мне с этим справиться?