Skip to content

Web UI rompe con 500 en / — TypeError en index() por conflicto entre @errorhandler(404) y las rutas catch-all #548

Description

@pablosaru

Versión de Faraday: 5.23.0 y 5.23.2 (instalación con Docker, paquete faradaysec)

Componente: faraday-server

Pasos para reproducir:

  1. Levantar Faraday con Docker (docker-compose con faraday_server, faraday_worker, faraday_beat, faraday_redis, faraday_db).
  2. Iniciar los contenedores y abrir http://localhost:5985 en el navegador.

Comportamiento esperado:
La interfaz web carga normalmente.

Comportamiento actual:
Cualquier request a / devuelve un 500 Internal Server Error.

Traceback:

[2026-08-31 00:49:24,966] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/src/.venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
  File "/src/.venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/src/.venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
  File "/src/.venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
TypeError: create_app.<locals>.index() got an unexpected keyword argument 'text'

Causa raíz:
En faraday/server/app.py, la vista index dentro de create_app está decorada al mismo tiempo como manejador de error 404 y como ruta catch-all para la SPA:

@app.errorhandler(404)
@app.route('/', defaults={'text': ''})
@app.route('/<path:text>')
def index(ex):
    """
    Handles 404 errors of paths.
    :param ex: Exception to return.
    :return: The exception if the path starts with the prefixes, or the default static file.
    """
    prefixes = ('/_api', '/v3', '/socket.io')
    if request.path.startswith(prefixes):
        return ex
    return app.send_static_file('index.html')

Flask invoca esta función de forma distinta según qué decorador la disparó:

  • Como error handler, la llama posicionalmente: index(instancia_de_excepcion).
  • Como vista de ruta (matcheada por @app.route(...)), la llama con la variable capturada de la URL como keyword argument: index(text=...).

Como la firma de la función solo declara ex como único parámetro posicional, cualquier request matcheado vía los decoradores de ruta (lo que incluye cualquier GET / normal) falla con TypeError: index() got an unexpected keyword argument 'text'. Esto rompe completamente la interfaz web en una instalación nueva.

Fix sugerido:
Que la firma acepte ambos estilos de invocación, ya que el cuerpo de la función no usa el valor de text para nada:

def index(ex=None, text=None):
    prefixes = ('/_api', '/v3', '/socket.io')
    if request.path.startswith(prefixes):
        return ex
    return app.send_static_file('index.html')

Aplicando este cambio localmente se soluciona el problema y la UI carga con normalidad.

Quedo a disposición para dar más detalles o probar un patch si hace falta.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions