Django - ошибка "Параметр MEDIA_URL должен заканчиваться слэшем." вызывает проблемы при установке пути к файлу в Windows

Итак, если вы установите MEDIA_URL под settings.py без прямого слеша (эта штука /, вы не можете делать обратные слеши, я пробовал) в конце, вы получите

ERRORS:
?: (urls.E006) The MEDIA_URL setting must end with a slash.

Проблема заключается в том, что если я хочу хранить файлы локально для тестов, а фронтенд будет получать их для тестирования локально. Если вы работаете в Windows, то при установке MEDIA_URL=os.path.join(BASE_DIR, 'media/') вы получите двойные обратные косые черты между каталогами, как например:

'/C:\\Users\\Blah\\Documents\\media/videos\\user_6badb4b8-33ba-4bb9-aa9a-2e3afb359960\\2de754bd-644e-466b-8dbb-e4d47a90aaee.mp4'

Как вы видите, после media среди всех двойных обратных косых черт есть одна прямая косая черта, которая может вызвать проблемы при поиске этого адреса, но если вы работаете на mac, то вместо нее будет использоваться прямая косая черта, что вполне нормально. Как можно обойти это, чтобы получить последовательные пути с косой чертой, которые могут быть отображены изображением или видео компонентами в React Native, при разработке на Windows?

Не используйте системный путь сервера в MEDIA_URL.

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = 'media/'

Построение абсолютных URL на этапе сериализации.

  1. Подкласс URLField для переопределения to_representation:
class URLField(serializers.URLField):

    def to_representation(self, value):
        url = super().to_representation(value)
        request = self.context.get('request')
        if request is not None:
            return request.build_absolute_uri(url)
        return url
  1. Используйте пользовательские URLField:
class VideoSerializer(serializers.ModelSerializer):
    video_url = URLField(read_only=True)  # Add this

    class Meta:
        model = Video
        fields = ('uuid', 'video_url', 'created')
  1. Передайте request в context сериализатору:
# serializer = full_post_data_serializer(Post.objects.order_by('-uuid')[:count])
serializer = full_post_data_serializer(Post.objects.order_by('-uuid')[:count], request)
# def full_post_data_serializer(post_query_set: QuerySet):
def full_post_data_serializer(post_query_set: QuerySet, request):
    # ...
    # return FullPostDataSerializer(query_set_annotated, many=True)
    return FullPostDataSerializer(query_set_annotated, many=True, context={'request': request})

Подобные поля DRF и сериализаторы:

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