Как отправить ссылку на изображение в ответе

Я хочу в ответе отправить ссылку на фотографию, которая находится на хостинге, я запускаю django приложение на хостинге через python manage.py runserver 0.0.0.0:8000 . Как мне сделать так, чтобы в ответе на запрос была ссылка на изображение, которое находится на хостинге.

Пример: Я получаю такой ответ при обращении к API

{
    "title": "add",
    "description": "some text",
    "image": "http://127.0.0.1:8000/media/photo_2022-09-12_20-57-08.jpg",
    "created_at": "2022-09-12T22:24:42.449098+03:00"
}

Я хочу получить такой ответ:

{
    "title": "add",
    "description": "some text",
    "image": "domain.api/media/photo_2022-09-12_20-57-08.jpg",
    "created_at": "2022-09-12T22:24:42.449098+03:00"
}


models.py

class Event(models.Model):
    title = models.TextField()
    description = models.TextField()
    image = models.ImageField(blank=True)
    is_main = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

views.py

class EventDetailOrList(viewsets.ReadOnlyModelViewSet):
    queryset = Event.objects.all()
    serializer_class = EventSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = EventFilter

Я бы использовал модуль socket для получения имени хоста IP:

import socket
     
address = 127.0.0.1:8000
host = socket.gethostbyaddr(address)
 
return host

Если у вас есть доступ к объекту request, вы можете сделать что-то вроде

request.META['REMOTE_ADDR']         # '127.0.0.1'
root = request.META['HTTP_HOST']    # '127.0.0.1:8000'

# combined with: 
from django.templatetags.static import static
path = static('media/nealium_avatar.png')


full = '{0}/{1}'.format(root, path)
# full = '127.0.0.1:8000/static/media/nealium_avatar.png'

Давайте сделаем это шаг за шагом:

1. settings.py

INSTALLED_APPS = [
...
...
...
'django.contrib.sites',
...
...
]


SITE_ID = 1

после этого нужно запустить migrate

python manage.py migrate

2. models.py

class Event(models.Model):
    title = models.TextField()
    description = models.TextField()
    image = models.ImageField(blank=True)
    is_main = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def get_image(self):
        if self.image:
            return Site.objects.get_current().domain + self.image.url
        else:
            return ""

3. serializers.py

class EventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = [
            'title',
            'description',
            'get_image',
            'created_at',
        ]

После этих шагов вы можете редактировать домен вашего сайта на панели Django Admin.

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

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