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 на этапе сериализации.
- Подкласс
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
- Используйте пользовательские
URLField
:
class VideoSerializer(serializers.ModelSerializer):
video_url = URLField(read_only=True) # Add this
class Meta:
model = Video
fields = ('uuid', 'video_url', 'created')
- Передайте
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 и сериализаторы:
- URLField
- FileField
- encode/django-rest-framework/blob/fdb4931/rest_framework/fields.py#L1566-L1569 (эталонная реализация для абсолютных URL) >
- HyperlinkedModelSerializer
- Абсолютные и относительные URL (включают
request
в контекст сериализатора)
- Абсолютные и относительные URL (включают