Proper POST file upload (load testing with Locust)

Nikolay Matkheev picture Nikolay Matkheev · Mar 22, 2016 · Viewed 7.6k times · Source

I'm trying to make a load test for Django-based website.

I use Locust 0.7.3 and python 2.7.10

Here I make POST - filling the form and attaching some file:

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'),
        })

Everything's seemed to be ok, but on the server's upload folder there's no file!

What I'm doing wrong?

Answer

Nikolay Matkheev picture Nikolay Matkheev · Mar 23, 2016

Well, I found the solution and I hope it will be useful for someone:

Here was described how Django handles file: How to send a "multipart/form-data" with requests in python?

And recipe is to define 'files' param in post function:

    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})