尝试将文件上传的单元测试写入django Restless API

时间:2015-06-15 17:44:33

标签: python django rest file-upload request

我正在编写一个相当小的轻量级REST api,所以我选择了不安分作为最快/最简单的支持。我似乎并不需要django-REST模块的所有复杂性和支持。我的服务只会收到并发送json,但用户需要将文件上传到一个端点。目前我的文件上传视图/ api代码如下:

class SubmissionCreate(Endpoint):

def post(self, request):
    # get the data from the post request
    data = {}
    data['input_data'] = request.FILES['input_data'].read().decode('UTF-8')
    data['submission_name'] = request.FILES['submission_name'].read().decode('UTF-8')

    submission_form = SubmissionForm(data)
    if submission_form.is_valid():
        s = submission_form.save()
        return {'message': 'file uploaded'}
    else:
        return {'error': 'Input information is not correctly formatted'}

我还写了一个带有Requests to upload files

的小客户端
import os
import requests
import json

url = 'http://127.0.0.1:8000/submission/create/'
payload = {'input_data': ('input.txt', open('./static/files/file1.txt', 'rb')), 'submission_name': 'test'}
r = requests.post(url, files=payload)

这很好用,我可以用我的客户端将文件推送到数据库。但显然我需要进行一些适当的测试才能给出更复杂的行为,所以我查看了文档并编写了以下测试

class SubmissionCreateTests(TestCase):

    def test_submissioncreate_will_accept_data(self):

        f = SimpleUploadedFile("file.txt", bytes("file_content", 'utf-8'))
        response = self.client.post(reverse('submission_data'), 
                    {'input_data': f, 'submission_name': 'test'})
        self.assertEqual(response.status_code, 200)

然而,这会产生以下错误:

django.utils.datastructures.MultiValueDictKeyError: "'submission_name'"

如果我将content_type设置为' application / x-www-form-urlencoded'我犯了同样的错误。

如果我将content_type设置为' multipart / form-data'我得到400错误,但测试运行没有异常抛出。

1 个答案:

答案 0 :(得分:0)

我试图解决这个问题,但最终切换到Django-REST框架变得更快更容易。对于Djano-REST来说文档要好得多,因此设置它并构建测试是微不足道的。关于django的不安分或django-restless模块​​似乎没有时间节省。