This is an automated email from the ASF dual-hosted git repository.

vincbeck pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new e5cb168fafe Fix duplicated SQLAlchemy sessions caused transactions 
fail to close (#57815)
e5cb168fafe is described below

commit e5cb168fafe40059233ed9ab5fa191f1958a89fd
Author: Simon Meng <[email protected]>
AuthorDate: Sat Nov 8 08:53:53 2025 +0800

    Fix duplicated SQLAlchemy sessions caused transactions fail to close 
(#57815)
---
 .../fab/auth_manager/api_fastapi/routes/login.py   | 40 ++++++++++------------
 providers/fab/src/airflow/providers/fab/www/app.py |  9 +++--
 providers/fab/www-hash.txt                         |  2 +-
 3 files changed, 26 insertions(+), 25 deletions(-)

diff --git 
a/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py
 
b/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py
index fd728c78a11..a822356ff63 100644
--- 
a/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py
+++ 
b/providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py
@@ -27,7 +27,6 @@ from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_
 from airflow.configuration import conf
 from airflow.providers.fab.auth_manager.api_fastapi.datamodels.login import 
LoginBody, LoginResponse
 from airflow.providers.fab.auth_manager.api_fastapi.services.login import 
FABAuthManagerLogin
-from airflow.providers.fab.auth_manager.cli_commands.utils import 
get_application_builder
 
 login_router = AirflowRouter(tags=["FabAuthManager"])
 
@@ -40,8 +39,7 @@ login_router = AirflowRouter(tags=["FabAuthManager"])
 )
 def create_token(body: LoginBody) -> LoginResponse:
     """Generate a new API token."""
-    with get_application_builder():
-        return FABAuthManagerLogin.create_token(body=body)
+    return FABAuthManagerLogin.create_token(body=body)
 
 
 @login_router.post(
@@ -52,10 +50,9 @@ def create_token(body: LoginBody) -> LoginResponse:
 )
 def create_token_cli(body: LoginBody) -> LoginResponse:
     """Generate a new CLI API token."""
-    with get_application_builder():
-        return FABAuthManagerLogin.create_token(
-            body=body, expiration_time_in_seconds=conf.getint("api_auth", 
"jwt_cli_expiration_time")
-        )
+    return FABAuthManagerLogin.create_token(
+        body=body, expiration_time_in_seconds=conf.getint("api_auth", 
"jwt_cli_expiration_time")
+    )
 
 
 @login_router.get(
@@ -64,18 +61,17 @@ def create_token_cli(body: LoginBody) -> LoginResponse:
 )
 def logout(request: Request) -> RedirectResponse:
     """Generate a new API token."""
-    with get_application_builder():
-        login_url = get_auth_manager().get_url_login()
-        secure = request.base_url.scheme == "https" or bool(conf.get("api", 
"ssl_cert", fallback=""))
-        response = RedirectResponse(login_url)
-        response.delete_cookie(
-            key="session",
-            secure=secure,
-            httponly=True,
-        )
-        response.delete_cookie(
-            key=COOKIE_NAME_JWT_TOKEN,
-            secure=secure,
-            httponly=True,
-        )
-        return response
+    login_url = get_auth_manager().get_url_login()
+    secure = request.base_url.scheme == "https" or bool(conf.get("api", 
"ssl_cert", fallback=""))
+    response = RedirectResponse(login_url)
+    response.delete_cookie(
+        key="session",
+        secure=secure,
+        httponly=True,
+    )
+    response.delete_cookie(
+        key=COOKIE_NAME_JWT_TOKEN,
+        secure=secure,
+        httponly=True,
+    )
+    return response
diff --git a/providers/fab/src/airflow/providers/fab/www/app.py 
b/providers/fab/src/airflow/providers/fab/www/app.py
index e12fd064c09..06e5285bdac 100644
--- a/providers/fab/src/airflow/providers/fab/www/app.py
+++ b/providers/fab/src/airflow/providers/fab/www/app.py
@@ -30,7 +30,7 @@ from airflow.api_fastapi.app import get_auth_manager
 from airflow.configuration import conf
 from airflow.exceptions import AirflowConfigException
 from airflow.logging_config import configure_logging
-from airflow.providers.fab.www.extensions.init_appbuilder import 
init_appbuilder
+from airflow.providers.fab.www.extensions.init_appbuilder import 
AirflowAppBuilder
 from airflow.providers.fab.www.extensions.init_jinja_globals import 
init_jinja_globals
 from airflow.providers.fab.www.extensions.init_manifest_files import 
configure_manifest_files
 from airflow.providers.fab.www.extensions.init_security import init_api_auth
@@ -94,7 +94,12 @@ def create_app(enable_plugins: bool):
     init_api_auth(flask_app)
 
     with flask_app.app_context():
-        init_appbuilder(flask_app, enable_plugins=enable_plugins)
+        AirflowAppBuilder(
+            app=flask_app,
+            session=db.session,
+            base_template="airflow/main.html",
+            enable_plugins=enable_plugins,
+        )
         init_error_handlers(flask_app)
         # In two scenarios a Flask application can be created:
         # - To support Airflow 2 plugins relying on Flask (``enable_plugins`` 
is True)
diff --git a/providers/fab/www-hash.txt b/providers/fab/www-hash.txt
index 418e86c7dda..47ac6b43c6c 100644
--- a/providers/fab/www-hash.txt
+++ b/providers/fab/www-hash.txt
@@ -1 +1 @@
-c45890ac6b17386adfb076a4baec17589a26aab189d6257a92138aaa720fbc7f
+cc109e95a25c1bb018a85a6a40859234398d5a9ac5bf317197eed3e3ece64b0d

Reply via email to