正确的POST文件上传(使用Locust进行负载测试)

13

我正在尝试为基于Django的网站制作负载测试。

我使用的是Locust 0.7.3和Python 2.7.10。

这里我进行POST操作-填写表单并附加一些文件:

class WebsiteTasks(TaskSet):
    def on_start(self):
        self.client.get("/")

    @task
    def submit(self):
        response = self.client.get("/submit/")
        csrftoken = response.cookies['csrftoken']
        attach = open('file.pdf', 'rb')

        r = self.client.post("/submit/", {
           'csrfmiddlewaretoken': csrftoken,
           'password': smart_str(u'wkefjgui'),
           'payload': smart_str(u'kjsdgfljdsh'),
           'docfile': attach,
           'commit': smart_str(u'Вкрапить / Embed'),
        })

一切似乎都没问题,但服务器上传文件夹中没有文件!

我做错了什么?

3个回答

11

好的,我找到了解决方案,希望对某些人有用:

这里描述了Django如何处理文件:如何在python中使用请求发送“multipart/form-data”?

而解决方法是在post函数中定义“files”参数:

    r = self.client.post("/submit/", data={
        'csrfmiddlewaretoken': csrftoken,
        'password': smart_str(u'wkefjgui'),
        'payload': smart_str(u'kjsdgfljdsh'),
        'commit': smart_str(u'Вкрапить / Embed'),
         }, files={'docfile': attach})

3

handle multipart file

 def _get_image_part(self, file_path, file_content_type='image/jpeg'):
        import os
        file_name = os.path.basename(file_path)
        file_content = open(file_path, 'rb')
        return file_name, file_content, file_content_type

最初的回答

多部分测试案例


class OpenDeviceFrontApi(TaskSet):

    @task(2)
    def rec_log_upload(self):
        payload = {
            "device_key": device_key
        }
        files = {
            "scene_img": self._get_image_part("data/face/rec1.jpg"),
            "face_img": self._get_image_part("data/face/rec2.jpg")
        }
        r = self.client.post("/log/rec_log_upload", data=payload, files=files, verify=False)
        assert r.status_code == 200
        rData = json.loads(r.text, encoding="utf-8")


官方网站:https://docs.locust.io/en/stable/api.html?highlight=multipart - geosmart

0

如何在Django服务器上使用Locust测试文件上传:

def post_img(self):
    files = {'media': open('img.png', 'rb')}
    response=self.client.post("/upload",files=files)
    print('Response is -: ',response)

1
欢迎来到StackOverflow。虽然这段代码可能解决了问题,但是包含解释代码如何以及为什么解决问题的说明会真正有助于提高您的帖子质量,并可能导致更多赞同票。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并指出适用的限制和假设。在这里看看 → 我该如何编写一个好答案? - Federico Baù

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接