Показать абсолютный URL для загруженного файла

#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 для размещения свои изображения, так как в конечном итоге я буду хранить их в облаке в процессе производства.

Поэтому:

  1. Установлены необходимые пакеты cloudinary python, т.е. cloudinary и dj3-cloudinary-storage
  2. Добавлено cloudinary в установленные приложения:
     INSTALLED_APPS = [
        ......
        'rest_framework',
        'django_extensions',
        'corsheaders',
        'cloudinary', # Add cloudinary 
        'drf_yasg',
        'celery',
        'django_prometheus',
        'debug_toolbar',
        
    
    ]
 
  1. Изменено хранилище файлов по умолчанию в settings.py и добавил облачные конфигурации:
 
CLOUDINARY_STORAGE = {
    'CLOUD_NAME': '*******',
    'API_KEY': '*********',
    'API_SECRET': '*********',
}


DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
 
  1. Удалено ниже, оно больше не нужно в корне urls.py

urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

После тестирования загрузки вот результаты:

введите описание изображения здесь