Тестирование загрузки Django с использованием саранчи, выдающей ошибку токена Csrf

Я пишу скрипт для нагрузочного тестирования для своего приложения 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

Любые предложения о том, как исправить эту ошибку?


person Nishant Kumar    schedule 05.08.2018    source источник
comment
Вы нашли решение? Я испытываю ту же проблему   -  person Giorgio    schedule 20.10.2018


Ответы (3)


Есть два требования, чтобы это работало:

  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/'
    })
person philoj    schedule 25.01.2019

У меня такая же проблема.

У меня есть экземпляр Django 1.11, а имя csrftoken другое, в моем случае:

csrftoken = response.cookies['csrftoken_myproject']

И я искал имя csrftoken с помощью devtools из браузер Chromium (например).

person tres.14159    schedule 03.01.2019

 def on_start(self):
        self.login()

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

этого достаточно для входа. нет необходимости обновлять csrftoken в python. 3.6.8

person Shehantha Edirisinghe    schedule 07.04.2021