You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Locust的需登录本地网站压测问题求助

Locust压测登录实现方案(解决SSL验证失败及登录问题)

一、先解决SSLCertVerificationError错误

本地站点或企业VPN的SSL证书多为自签名,Locust默认启用SSL验证会导致请求失败,直接全局关闭验证即可:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 3)
    
    def __init__(self, parent):
        super().__init__(parent)
        # 全局关闭SSL证书验证,所有请求自动生效
        self.client.verify = False

也可针对单个请求临时设置:self.client.get("/homepage", verify=False)

二、正确模拟登录流程(接口级替代Selenium)

直接发POST请求失败,核心原因是未处理登录页的CSRF Token或请求头不匹配,按以下步骤实现:

  1. 获取登录页CSRF Token
    先请求登录页面,从响应HTML中提取CSRF Token(字段名根据实际站点调整,比如csrfmiddlewaretoken、_csrf):
def on_start(self):
    # 访问登录页获取Token
    login_page = self.client.get("https://vpn.company.com/login")
    # 正则提取Token(需匹配页面实际的HTML结构)
    import re
    csrf_token = re.search(r'name="csrfmiddlewaretoken" value="(.*?)"', login_page.text).group(1)
  1. 构造登录POST请求
    带上提取的Token、用户名密码,同时匹配浏览器请求头(比如Referer,部分站点会校验来源):
def on_start(self):
    # 省略获取Token的代码...
    login_data = {
        "username": "your_test_account",
        "password": "your_test_password",
        "csrfmiddlewaretoken": csrf_token
    }
    login_response = self.client.post(
        "https://vpn.company.com/login",
        data=login_data,
        headers={"Referer": "https://vpn.company.com/login"}
    )
    # 验证登录状态(根据实际情况调整,比如检查响应码或跳转逻辑)
    assert login_response.status_code in [200, 302]
  1. 自动复用登录Cookie
    Locust的HttpUser.client会自动保存登录后的Cookie,后续请求主页时无需手动设置,会自动携带认证信息。

三、完整测试类示例

from locust import HttpUser, task, between
import re

class AuthenticatedUser(HttpUser):
    wait_time = between(1, 3)
    
    def __init__(self, parent):
        super().__init__(parent)
        self.client.verify = False  # 关闭SSL验证

    def on_start(self):
        # 每个虚拟用户启动时先完成登录
        self.login()

    def login(self):
        # 1. 获取CSRF Token
        login_page = self.client.get("https://vpn.company.com/login")
        csrf_token = re.search(r'name="csrfmiddlewaretoken" value="(.*?)"', login_page.text).group(1)
        
        # 2. 发送登录请求
        login_payload = {
            "username": "test_user",
            "password": "test_pass",
            "csrfmiddlewaretoken": csrf_token
        }
        response = self.client.post(
            "https://vpn.company.com/login",
            data=login_payload,
            headers={"Referer": "https://vpn.company.com/login"}
        )
        
        # 校验登录结果,失败则终止当前用户
        if response.status_code not in [200, 302]:
            raise Exception("登录失败")

    @task
    def visit_homepage(self):
        # 登录后访问主页,自动携带认证Cookie
        response = self.client.get("https://localhost/homepage")
        assert response.status_code == 200

注意事项

  • 若CSRF Token存储在Cookie中(比如csrf-token字段),则从login_page.cookies中提取。
  • 若企业VPN登录包含验证码、双因素认证,需提前准备对应解决方案(比如验证码池、对接认证接口)。
  • 压测时需准备足够多的测试账号,避免同一账号重复登录被系统限制。

内容的提问来源于stack exchange,提问作者PillagingProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:21