Django sessionid не создан для клиента Locust
Я использую Django 2.2.24 и Locust 2.1.0 для нагрузочного тестирования. Когда я запускаю некоторые тесты Locust, войдя в систему как пользователь Django admin, никаких проблем не возникает - все мои GET работают как ожидалось.
Сейчас я действительно вхожу в систему как определенный пользователь. Из веб-интерфейса Django без проблем передает CSRFtoken и токен sessionid. Однако в клиенте Locust sessionid вообще не отображается. Мало того, когда я смотрю в таблицу django_session (где действительно существуют веб-токены), там нет токенов для клиента Locust.
Я думаю, что это больше связано с управлением сессиями Django, чем с locust - отсюда и сообщение на этом форуме.
Мой файл саранчи выглядит следующим образом:
def on_start(self):
'''
The start script for each user - this order is important
'''
# Below 3 lines work fine - we get the csrftoken and put it in the header successfully
response = self.client.get("/accounts/login")
self.csrftoken = response.cookies['csrftoken']
self.headers = {'X-CSRFToken': self.csrftoken}
# Now login with username and password as POST
r1 = self.login()
return r1
def login(self):
# admin login and retrieving it's access token
udata = {'username': self.username, 'password': self.password}
cookies=self.client.cookies.get_dict())
#csrftoken cookie does exist, sessionid does not yet.
log.info("Current cookies in Login:" + str(self.client.cookies))
# This next line should come back with a sessionid
# from Django - but it does not.
response = self.client.post("/accounts/login/",
data=json.dumps(udata),
headers=self.headers)
log.info("Response from client.post="+str(response)) #OK
log.info("Response status code:" + str(response.status_code))
log.info("Response text=" + response.text)
# Next line does not contain sessionid or Set-Cookie
log.info("Headers from post/accts/login = " + str(response.headers))
Спасибо за любую помощь.
Change
response = self.client.post("/accounts/login/",
data=json.dumps(udata),
headers=self.headers)
to
response = self.client.post("/accounts/login/",
json=udata,
headers=self.headers)
... чтобы получить соответствующие json-заголовки. Или используйте:
response = self.client.post("/accounts/login/",
data=udata,
headers=self.headers)
для того, чтобы отправить его как закодированные формой данные вместо json.