使用蝗虫的Django负载测试给出Csrf令牌错误

时间:2018-08-05 11:31:52

标签: django load-testing locust

我正在为django应用程序编写用于负载测试的脚本,但是出现错误消息:

raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='csrftoken', domain=None, path=None"

这是我的剧本:

from locust import HttpLocust, TaskSet, task
import requests

class UserBehavior(TaskSet):
    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def login(self):
        response = self.client.get("/")
        csrftoken = response.cookies['csrftoken']
        self.client.post('/check_login/',{'username': '####', 'password': '########'},headers={'X-CSRFToken': csrftoken})


    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def profile(self):
        self.client.get("/home")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

在命令行中,我给此命令启动蝗虫:locust --host=http://localhost:8080

有关如何纠正此错误的任何建议?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。

我有Django 1.11实例,而csrftoken的名称是其他名称,

csrftoken = response.cookies['csrftoken_myproject']

例如,我已经用devtools中的Chromium browser搜索了csrftoken名称。

答案 1 :(得分:0)

要满足此要求,有两个要求:

  1. csrftoken应该作为csrfmiddlewaretoken传递到表单数据中。
  2. 带有X-CSRFToken标头和Referer标头 也是必需的。

代码如下:

self.client.post(
    '/check_login/',
    {
        'username': '####',
        'password': '########',
        'csrfmiddlewaretoken': csrftoken
    },
    headers={
        'X-CSRFToken': csrftoken,
        'Referer': self.parent.host + '/check_login/'
    })

答案 2 :(得分:0)

 def on_start(self):
        self.login()

    def login(self):
        # login to the application
        self.client.auth = HTTPBasicAuth('username', 'password')

这足以登录。无需在 python 中更新 csrftoken。 3.6.8