django rest framework圖片上傳測試,以及drf測試所踩的一些坑

django rest framework圖片上傳測試

models.py

# http://easy-thumbnails.readthedocs.io/
# easy-thumbnails==2.3.0
from easy_thumbnails.fields import ThumbnailerImageField
class Dish(models.Model):
    name = models.CharField(_(u'name'), max_length=100)
    photo = ThumbnailerImageField(upload_to=dish_directory_path, null=True, blank=True, verbose_name=_(u'photo'))

serializers.py

class ThumbnailImageField(serializers.ImageField):
    """
    從 easy_thumbnails.fields.ThumbnailerImageField 字段類型中解析出縮略圖信息
    """

    def __init__(self, *args, **kwargs):
        self.size_alias = kwargs.pop('size_alias', 'large')
        kwargs['read_only'] = True
        super(ThumbnailImageField, self).__init__(*args, **kwargs)

    def to_representation(self, value):
        try:
            return value[self.size_alias].url
        except Exception:
            return None

class DishSerializer(serializers.ModelSerializer):
    thumb = ThumbnailImageField(source="photo", size_alias='medium')

    class Meta:
        model = Dish

tests.py

    #from rest_framework.test import APITestCase

    def create_dish(self):
        #此處圖片路徑爲絕大路徑,static目錄和tests.py文件同級
        image_path = os.path.join(os.path.dirname(
            os.path.abspath(__file__)), 'static/test/dish_image.jpg')
        image_fp = open(image_path, 'rb')

        self.dish_data['photo'] = image_fp
        #注意post()的format值爲"multipart"而不是json
        response = self.client.post(url, self.dish_data,
                                    format='multipart')
        image_fp.close()
        return response

    def test_create_dish(self):
        resp = self.create_dish()
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        self.assertEqual(self.dish_data['name'], resp.data['name'])
        self.assertTrue(resp.data['photo'])
        self.assertTrue('http://testserver/' in resp.data['photo'])

drf的解析器默認配置是

'DEFAULT_PARSER_CLASSES': (
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser'
)

如果是文件上傳可能還要添加:
‘rest_framework.parsers.FileUploadParser’

drf測試所踩的一些坑

使用測試客戶端的get方法上,習慣性的對url進行查詢字符串拼裝
(eg: search_url = “%s?name=%s” % (url, query)),
然後在調用時老是在self.client.get(search_url)裏面拋出編碼錯誤,各種轉碼,各種蛋疼,然後去看drf的get源碼發現,完全不用拼裝url,像post一樣直接傳遞參數就可以了,如self.client.get(search_url,data={‘name’: query}),get函數內部已經實現轉碼。這件事告訴我們要多看源碼,不要想當然啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章