{"record":{"id":"64195707fe6d7439","repo":"locustio/locust","slug":"the-login-manager-is-only-available-with-web-log","errorCode":null,"errorMessage":"The login_manager is only available with --web-login.\n","messagePattern":"The login_manager is only available with --web-login\\.\n","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"locust/web.py","lineNumber":618,"sourceCode":"            return {}, 201\n\n        @app_blueprint.route(\"/worker-count\")\n        @self.auth_required_if_enabled\n        def get_worker_count():\n            return {\n                \"worker_count\": self.environment.runner.worker_count\n                if isinstance(self.environment.runner, MasterRunner)\n                else 0\n            }\n\n        app.register_blueprint(app_blueprint)\n\n    @property\n    def login_manager(self):\n        if self.web_login:\n            return self._login_manager\n\n        raise AttributeError(\"The login_manager is only available with --web-login.\\n\")\n\n    @login_manager.setter\n    def login_manager(self, value):\n        self._login_manager = value\n\n    def start(self):\n        self.greenlet = gevent.spawn(self.start_server)\n        self.greenlet.link_exception(greenlet_exception_handler)\n\n    def start_server(self):\n        if self.tls_cert and self.tls_key:\n            self.server = pywsgi.WSGIServer(\n                (self.host, self.port), self.app, log=None, keyfile=self.tls_key, certfile=self.tls_cert\n            )\n        else:\n\n            class RewriteFilter(logging.Filter):\n                def filter(self, record) -> bool:","sourceCodeStart":600,"sourceCodeEnd":636,"githubUrl":"https://github.com/locustio/locust/blob/f391a716e12c2c712e80b5835e877b7933397453/locust/web.py#L600-L636","documentation":"The WebUI exposes login_manager as a property, but it only returns the internal Flask-Login manager when the web UI was started with --web-login. Accessing it otherwise raises an AttributeError instructing you to enable web login. This is an intentional guard, not a missing attribute.","triggerScenarios":"Custom web UI extensions or plugins touching `environment.web_ui.login_manager` (or subclass code) when locust was launched without --web-login; code reading/flashing login state in a custom route.","commonSituations":"Deploying the same web UI extension across environments where only some enable --web-login; upgrading locust and adopting the login feature without adding the flag.","solutions":["Start locust with --web-login (and configure authentication, e.g. --web-login with the auth env settings)","Guard access: check `web_ui.web_login` before touching login_manager","Override or register Flask-Login differently in a custom subclass where you manage the manager yourself"],"exampleFix":"# before\nweb_ui.login_manager.login_view = 'login'  # AttributeError without --web-login\n\n# after\nif web_ui.web_login:\n    web_ui.login_manager.login_view = 'login'","handlingStrategy":"try-catch","validationCode":"if getattr(web_ui, 'web_login', False):\n    lm = web_ui.login_manager","typeGuard":"def has_login_manager(web_ui) -> bool:\n    return bool(getattr(web_ui, 'web_login', False)) and getattr(web_ui, '_login_manager', None) is not None","tryCatchPattern":"try:\n    lm = web_ui.login_manager\nexcept AttributeError:\n    lm = None  # --web-login not enabled; skip auth-related setup\nif lm:\n    lm.login_view = 'login'","preventionTips":["Launch the web UI with --web-login whenever extensions depend on Flask-Login","Check web_ui.web_login before accessing auth features","Document the --web-login requirement in any custom web UI plugin","Add a startup assertion in dev/test to catch missing flags early"],"tags":["web-ui","flask-login","attribute-error"],"backgroundTag":"feature-flag-attribute-not-enabled","analyzedSha":"f391a716e12c2c712e80b5835e877b7933397453","analyzedAt":"2026-08-29T00:36:13.872Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}