【问题标题】:Django sessionid not created for Locust client没有为 Locust 客户端创建 Django sessionid
【发布时间】:2021-10-29 10:55:47
【问题描述】:

我正在运行 Django 2.2.24 和 Locust 2.1.0 进行负载测试。当我以 Django 管理员用户身份登录运行一些 Locust 测试时,没有任何问题 - 我的所有 GET 都按预期工作。

现在我实际上是以特定用户身份登录的。从 Web 界面,Django 毫无问题地传递了一个 CSRFtoken 和一个 sessionid 令牌。然而,从 Locust 客户端,sessionid 根本不显示。不仅如此,当我查看 django_session 表(确实存在 Web 令牌的地方)时,Locust 客户端没有令牌。

我认为这与 Django 会话管理有关,而不是与 locust 相关 - 因此在此论坛上发帖。

我的 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)) 

感谢您的帮助。

【问题讨论】:

  • 从蝗虫的角度来看的一个评论是,我不明白你为什么在 on_start 中返回 r1?无论如何,该返回值将被忽略...此外,为了自动设置正确的 json 标头(并使您的代码更整洁),您可能需要使用 json=udata 而不是 data=json.dumps(udata) (标头可能是您的问题,但也可能无关紧要)
  • @Cyber​​wiz 感谢您的回复。您还解决了这个问题 - 一旦我替换了 data = udata(而不是 json.dumps(udata)),我就开始获取 sessionid 令牌。谢谢!

标签: django sessionid locust


【解决方案1】:

改变

response = self.client.post("/accounts/login/",
                            data=json.dumps(udata),
                            headers=self.headers)

到

response = self.client.post("/accounts/login/",
                            json=udata,
                            headers=self.headers) 

... 获取适当的 json 标头。或使用:

response = self.client.post("/accounts/login/",
                            data=udata,
                            headers=self.headers)

为了将其作为表单编码数据而不是 json 发送。

【讨论】:

  • 你是对的。事实上,在你第一次发表评论之后。我把:data=json.dumps(udata)改成data=udata,它开始工作了,但是响应时间大约是3秒(我是针对外部区块链的,所以我并不感到惊讶。我只是改变了它到 json=udata - 仍然有效,但响应时间要少得多。再次感谢。
  • 是的,我刚刚将我的评论更改为答案,因此您可以接受它作为解决方案:)
  • 啊,我只是更仔细地阅读了您的评论:这实际上是两件不同的事情,如果您只是执行 data=udata 您的请求将被表单编码,如果您执行 json=udata 它将是以 json 格式发送。我会更新答案。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2013-11-19
  • 2012-09-08
  • 2014-02-23
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多