#python #django
#python #django
Вопрос:
Я пытаюсь протестировать свою модель с помощью ImageField, для этого я читаю файл .jpg в двоичном режиме и сохраняю в модели. Я нахожу много вопросов в StackOverflow, но, похоже, у меня ничего не работает.
testImagePath = os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg')
"image" : SimpleUploadedFile(name='test_image.jpg', content=open(testImagePath, 'rb').read(), content_type='image/jpeg')
ошибка:
Ошибка UnicodeDecodeError: кодек ‘utf-8’ не может декодировать байт 0xff в позиции 0: недопустимый начальный байт
test.py
class Test(TestCase):
testUser = {
"username": "TestUser",
"email": "TestUser@mail.com",
"password": "TestUserPassword",
"confirm_password": "TestUserPassword"
}
testAlbum = {
"owner" : testUser['username'],
"name" : "Test Album"
}
testImagePath = os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg')
testPhoto = {
"owner" : testUser['username'],
"album" : testAlbum['name'],
"name" : "Test Photo",
"image" : SimpleUploadedFile(name='test_image.jpg', content=open(testImagePath, 'rb').read(), content_type='image/jpeg')
}
def setUp(self):
self.client = APIClient()
self.registerTestUser()
...
def test_photos_urls(self):
response = self.client.post('/api/photos/', self.testPhoto, format="json")
self.assertEqual(response.status_code, status.HTTP_201_CREATED, msg=response.content)
сериализатор:
class PhotoSerializer(serializers.HyperlinkedModelSerializer):
album = serializers.HyperlinkedRelatedField(view_name='album-detail', queryset=Album.objects)
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Photo
fields = ('pk', 'name', 'image', 'creation_date', 'owner', 'album',)
read_only_fields=('creation_date',)
Вид:
class PhotoViewSet(viewsets.ModelViewSet):
queryset = Photo.objects.all()
serializer_class = PhotoSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
Модель:
class Photo(models.Model):
album = models.ForeignKey(Album, related_name='photos', on_delete=models.CASCADE)
owner = models.ForeignKey(User, related_name='user_photos', on_delete=models.CASCADE)
name = models.CharField(max_length=80, default='New photo')
image = models.ImageField(name, upload_to=get_image_path)
creation_date = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
class Meta:
ordering = ['creation_date', ]
Полная трассировка ошибки:
Трассировка (последний последний вызов): файл «D:codeactivePythonDjangophoto-hubphoto-hubapitests.py «, строка 66, в файле test_photos_urls response = self.client.post(‘/api/photos/’, self.testPhoto, format=»json») «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 172, в пути сообщения, данные=данные,формат =формат, content_type=content_type, ** дополнительный) файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 93, в данных post, content_type = self._encode_data(данные, формат, content_type) Файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworktest.py «, строка 65, в файле _encode_data ret = renderer.render(данные) «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworkrenderers.py» , строка 103, в файле render separators=разделители «C:UsersUserAppDataLocalProgramsPythonPython35-32libjson__init__.py «, строка 237, в дампах **kw).encode(obj) Файл «C:UsersUserAppDataLocalProgramsPythonPython35-32libjsonencoder .py», строка 198, в файле encode chunks = self.iterencode(o, _one_shot=True) «C:UsersUserAppDataLocalProgramsPythonPython35-32libjsonencoder.py «, строка 256, в iterencode возвращает файл _iterencode(o, 0) «C:UsersUserAppDataLocalProgramsPythonPython35-32libsite-packagesrest_frameworkutilsencoders.py» , строка 54, по умолчанию возвращает obj.decode(‘utf-8’) UnicodeDecodeError:кодек ‘utf-8’ не может декодировать байт 0xff в позиции 0: недопустимый начальный байт
Комментарии:
1. Попробуйте это как: testImagePath = os.path.join(настройки. BASE_DIR, ‘test_image_folder’)
2. И после этого читать папку вместо файла?
3. Пожалуйста, укажите немного больше деталей вашей проблемы. пожалуйста, покажите свой код (views.py , models.py , шаблон и т.д.) для получения более подробной информации.
Ответ №1:
ImageField необходимо получить файл, а не данные. Это решает проблему:
"image" : open(os.path.join(settings.BASE_DIR, 'test_image_folder/test_image.jpg'), 'rb')