django实现文件上传功能和这个接口的单元测试用例

本文详细介绍了如何设置settings.py文件指向urls.py文件,并通过api/views.py文件实现/upload/接口,包括文件上传、压缩处理及返回响应。还提供了实现测试用例,确保功能正确实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.设置settings.py文件指向的urls.py文件,如下:

from api.views import upload_view

url(r'^upload/$', upload_view),

2.实现/upload/接口,api/views.py文件有如下内容:

@csrf_exempt
def upload_view(request):
    """
    method: POST
    api: /upload/
    """
    fp = request.FILES.get('file')
    compress = request.POST.get('compress')

    response = {}
    if fp:
        src_fn = save_original_image(fp)
        # settings.HOST_NAME请根据自己的要求设置
        response['url'] = 'http://%s/%s' % (settings.HOST_NAME, src_fn)
        if compress:
            to_fn = compress_image(src_fn)
            response['thumbnail_url'] = 'http://%s/%s' % (settings.HOST_NAME, to_fn)
    return JsonResponse(response)

以下是上面功能依赖的辅助函数

UPLOAD_DIR_FORMAT = '%Y%m%d'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
UPLOAD_DIR_FORMAT = '%Y%m%d'
DATE_FORMAT = '%Y-%m-%d'
TIME_FORMAT = '%H:%M:%S'

def datetime_to_str(x=None, fmt=DATETIME_FORMAT):
    x = x if x else datetime.datetime.now()
    return x.strftime(fmt)

def date_to_str(x=None, fmt=DATE_FORMAT):
    return datetime_to_str(x, fmt)

def save_original_image(fp):
    subdir = date_to_str(datetime.date.today(), UPLOAD_DIR_FORMAT)
    # settings.UPLOAD_ROOT设置为UPLOAD_ROOT = os.path.join(BASE_DIR, 'images')
    path = os.path.join(settings.UPLOAD_ROOT, subdir)
    if not os.path.exists(path):
        os.mkdir(path)
    with open(os.path.join(path, fp.name), 'wb') as dst_fp:
        for chunk in fp.chunks():
            dst_fp.write(chunk)
    return os.path.join(os.path.basename(settings.UPLOAD_ROOT), subdir, fp.name)


def compress_image(filename):
    rear = filename[filename.rfind('.'):]
    thumbnail_fn = filename.replace(rear, '-thumbnail'+rear)
    image = Image.open(os.path.join(settings.BASE_DIR, filename))
    image.thumbnail((128, 128))
    image.save(os.path.join(settings.BASE_DIR, thumbnail_fn), 'JPEG')
    return thumbnail_fn

3.至此,文件上传接口完成下面实现测试用例:

先在项目的data文件夹添加图片文件data/111.jpg,做好准备后,下面是代码:

class TestCommonFunction(TestCase):
    def test_upload_view(self):
        """
        python manage.py test --settings=proj_name.settings-test api.tests.TestCommonFunction.test_upload_view
        """
        url = '/upload/'
        client = Client()
        resp = self.client.get(url)
        self.assertFalse(json.loads(resp.content))

        with open('data/111.jpg', 'rb') as fp:
            response = client.post(url, data={'file': fp})
            json_resp = json.loads(response.content)
            self.assertTrue('url' in json_resp)
            self.assertEquals(len(json_resp), 1)
        with open('data/111.jpg', 'rb') as fp:
            response = client.post(url, data={'file': fp, 'compress': 1})
            json_resp = json.loads(response.content)
            self.assertTrue('url' in json_resp)
            self.assertTrue('thumbnail_url' in json_resp)
            self.assertEquals(len(json_resp), 2)

收工

转载于:https://my.oschina.net/rst/blog/480554

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值