#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я реализовал конечную точку загрузки файла с помощью DRF проблема в том, что в документах не отображается абсолютный URL-адрес файла, как показано ниже на скриншоте. Я ожидаю, что абсолютный URL-адрес начнется с http://localhost ....
Вот мои настройки django
STATIC_URL = '/static/'
# The folder hosting the files
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
## Serving the STATIC FILES
# As declared in NginX conf, it must match /src/static/
STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'static')
MEDIA_URL = '/media/'
# do the same for media files, it must match /opt/services/djangoapp/media/
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
models.py
class Document(models.Model):
"""This represents document class model."""
file = models.FileField(upload_to='documents/inspections/%Y/%m/%d')
timestamp = models.DateTimeField(auto_now_add=True)
@property
def name(self):
name = self.file.name[33:]
return name
Комментарии:
1. Вы не можете сделать это на уровне модели, если у вас нет доступа к
request
объекту. Лучше сделать это в сериализаторе2. Пожалуйста, добавьте свой сериализатор, может быть, я смогу попробовать
Ответ №1:
Django не предоставляет absoluteurl для изображения, хранящегося в моделях.Поле изображения. Но вы можете изменить свой сериализатор и сделать это с помощью serializer.SerializerMethodField. поскольку вы не предоставили свой сериализатор, я предполагаю, что это может выглядеть так:
class Document(seralizer.ModelSerializer):
file_url = serializer.SerializerMethodField()
class Meta:
model = Document
fields = ('id','name','timestamp','file_url')
def get_file_url(self, document):
request = self.context.get('request')
file_url = document.file.url
return request.build_absolute_uri(file_url)
Ответ №2:
Django rest framework по умолчанию создает абсолютные URL-адреса для поля файла, если вы передаете запрос в контексте сериализатора. Попробуйте передать запрос в сериализаторе следующим образом.
serializer = YourSerializer(<OTHER_ARGS>, context={'request': request})
Вы получите абсолютный URL автоматически.
Ответ №3:
Чтобы упростить задачу, я использовал cloudinary
для размещения свои изображения, так как в конечном итоге я буду хранить их в облаке в процессе производства.
Поэтому:
- Установлены необходимые пакеты cloudinary python, т.е.
cloudinary
иdj3-cloudinary-storage
- Добавлено
cloudinary
в установленные приложения:
INSTALLED_APPS = [
......
'rest_framework',
'django_extensions',
'corsheaders',
'cloudinary', # Add cloudinary
'drf_yasg',
'celery',
'django_prometheus',
'debug_toolbar',
]
- Изменено хранилище файлов по умолчанию в settings.py и добавил облачные конфигурации:
CLOUDINARY_STORAGE = {
'CLOUD_NAME': '*******',
'API_KEY': '*********',
'API_SECRET': '*********',
}
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
- Удалено ниже, оно больше не нужно в корне urls.py
urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
После тестирования загрузки вот результаты: