使用Locust进行Django负载测试时出现Csrf令牌错误

3

我正在为我的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:locust --host=http://localhost:8080 有关如何纠正此错误的任何建议?

你找到解决方案了吗?我也遇到了同样的问题。 - Giorgio
在login()中,使用get('/check_login/')代替get('/')。 - pyofey
3个回答

4

这需要满足两个条件才能正常工作:

  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
 def on_start(self):
        self.login()

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

这已经足够进行登录了。不需要在Python中更新csrftoken。3.6.8版本。

1
这对我很有效..谢谢。只需要从requests.auth导入HTTPBasicAuth即可。 - Nurhun

0

我遇到了同样的问题。

我有一个Django 1.11实例,csrftoken的名称是其他的,在我的情况下是:

csrftoken = response.cookies['csrftoken_myproject']

我已经使用Chromium浏览器devtools(例如)搜索了csrftoken名称。


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