为啥我在运行 Locust 时收到 403 错误?

Posted

技术标签:

【中文标题】为啥我在运行 Locust 时收到 403 错误?【英文标题】:Why am I getting a 403 error when running Locust?为什么我在运行 Locust 时收到 403 错误? 【发布时间】:2015-01-31 09:45:43 【问题描述】:

我正在使用Locust (python) 在 Django Web 应用程序上加载测试。我在运行脚本时不断收到 403 错误。

代码如下:

  from locust import HttpLocust, TaskSet

def index(l):
    l.client.get("/")
def login(l):
    l.client.post("/login/", "username":"an@id.com", "password":"education")
def upload(l):
    l.client.get("/upload-image/")
def home(l):
	 l.client.get("/home/")
def settings(l):
	l.client.get("/settings/")
def logout(l):
	l.client.get("/logout/")
class UserBehavior(TaskSet):
    tasks = index:1, upload:1, home:1, settings:1, logout:1

    def on_start(self):
        login(self)

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

【问题讨论】:

状态 403 表示禁止,因此您的凭据错误。用户不存在或者您忘记将 CSRF 令牌传递给您的视图。 怎么传入crsf token 请注意,将注销作为任务意味着 Locust 有时会选择它,然后您将有未经授权的客户端尝试与您的应用程序交互,您将再次遇到 401/403 错误。 【参考方案1】:

要扩展 ZacDelagrange 的答案,当您使用 https 时,您还必须设置 Referer 标头,因此在此示例中您可以这样做

def on_start(self):
    """ Run on start for every Locust hatched """
    r = self.client.get('')
    self.client.headers['Referer'] = self.client.base_url
    self.client.post('/accounts/login/', 
        'email': 'email', 'password': 'password',
         'csrfmiddlewaretoken': r.cookies['csrftoken'])

【讨论】:

谢谢,在我阅读您的回答之前,我认为推荐人是我的问题。【参考方案2】:

在您的根页面或登录页面上获取,从响应 cookie 中获取 csrf 令牌,然后使用 csrftoken 发布到您的登录 url。这应该将 csrf 令牌添加到客户端的 cookie 中并允许您浏览页面。

def on_start(self):
    """ Run on start for every Locust hatched """
    r = self.client.get('')
    self.client.post('/accounts/login/', 
        'email': 'email', 'password': 'password',
         'csrfmiddlewaretoken': r.cookies['csrftoken'])

【讨论】:

以上是关于为啥我在运行 Locust 时收到 403 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在本地使用 codeigniter 会收到 403 Forbidden 错误?

为啥我在使用 img 标签时会收到 403 禁止?

为啥我在 Django 收到 403 POST 请求错误?

为啥我尝试打开 URL 时收到 403 错误

尝试加密密码时收到以下错误:Artifactory response: 403 Forbidden

为啥 Django 管理员登录给我 403 CSRF 错误?