[Python] FastAPI or sqlachemy error encoding in python [closed]

Discussão em 'Python' iniciado por Stack, Março 15, 2025.

  1. Stack

    Stack Membro Participativo

    I've made a website with sqlachemy, fastAPI and postgresql in python.

    The error is raised when I try to login as a user.

    For information, I get the password and the email from an HTML/JS form and my database is encoded in UTF-8

    I have tested:

    • My function create_session works
    • My endpoint works

    This is the error I get:

    INFO: 127.0.0.1:54829 - "POST /login HTTP/1.1" 500 Internal Server Error
    ERROR: Exception in ASGI application
    + Exception Group Traceback (most recent call last):
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_utils.py", line 76, in collapse_excgroups
    | yield
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 178, in __call__
    | async with anyio.create_task_group() as task_group:
    | ~~~~~~~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 767, in __aexit__
    | raise BaseExceptionGroup(
    | "unhandled errors in a TaskGroup", self._exceptions
    | )
    | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
    +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 409, in run_asgi
    | result = await app( # type: ignore[func-returns-value]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | self.scope, self.receive, self.send
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | )
    | ^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__
    | return await self.app(scope, receive, send)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__
    | await super().__call__(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\applications.py", line 112, in __call__
    | await self.middleware_stack(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\errors.py", line 187, in __call__
    | raise exc
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\errors.py", line 165, in __call__
    | await self.app(scope, receive, _send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 177, in __call__
    | with recv_stream, send_stream, collapse_excgroups():
    | ~~~~~~~~~~~~~~~~~~^^
    | File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.752.0_x64__qbz5n2kfra8p0\Lib\contextlib.py", line 162, in __exit__
    | self.gen.throw(value)
    | ~~~~~~~~~~~~~~^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_utils.py", line 82, in collapse_excgroups
    | raise exc
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 179, in __call__
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\slowapi\middleware.py", line 136, in dispatch
    | response = await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 154, in call_next
    | raise app_exc
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 141, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in __call__
    | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    | raise exc
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    | await app(scope, receive, sender)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 715, in __call__
    | await self.middleware_stack(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 735, in app
    | await route.handle(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 288, in handle
    | await self.app(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 76, in app
    | await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    | raise exc
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    | await app(scope, receive, sender)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 73, in app
    | response = await f(request)
    | ^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\routing.py", line 301, in app
    | raw_response = await run_endpoint_function(
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | ...<3 lines>...
    | )
    | ^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\routing.py", line 212, in run_endpoint_function
    | return await dependant.call(**values)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\main.py", line 79, in login
    | token = loginUser(email, password)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\db.py", line 98, in loginUser
    | user = db.query(User).filter(User.email == email, User.password == password).first()
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2754, in first
    | return self.limit(1)._iter().first() # type: ignore
    | ~~~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2853, in _iter
    | result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
    | ~~~~~~~~~~~~~~~~~~~~^
    | statement,
    | ^^^^^^^^^^
    | params,
    | ^^^^^^^
    | execution_options={"_sa_orm_load_options": self.load_options},
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | )
    | ^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2365, in execute
    | return self._execute_internal(
    | ~~~~~~~~~~~~~~~~~~~~~~^
    | statement,
    | ^^^^^^^^^^
    | ...<4 lines>...
    | _add_event=_add_event,
    | ^^^^^^^^^^^^^^^^^^^^^^
    | )
    | ^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2241, in _execute_internal
    | conn = self._connection_for_bind(bind)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2110, in _connection_for_bind
    | return trans._connection_for_bind(engine, execution_options)
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "<string>", line 2, in _connection_for_bind
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 139, in _go
    | ret_value = fn(self, *arg, **kw)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1189, in _connection_for_bind
    | conn = bind.connect()
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3274, in connect
    | return self._connection_cls(self)
    | ~~~~~~~~~~~~~~~~~~~~^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
    | self._dbapi_connection = engine.raw_connection()
    | ~~~~~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3298, in raw_connection
    | return self.pool.connect()
    | ~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 449, in connect
    | return _ConnectionFairy._checkout(self)
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1263, in _checkout
    | fairy = _ConnectionRecord.checkout(pool)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
    | rec = pool._do_get()
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 179, in _do_get
    | with util.safe_reraise():
    | ~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__
    | raise exc_value.with_traceback(exc_tb)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 177, in _do_get
    | return self._create_connection()
    | ~~~~~~~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 390, in _create_connection
    | return _ConnectionRecord(self)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
    | self.__connect()
    | ~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
    | with util.safe_reraise():
    | ~~~~~~~~~~~~~~~~~^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__
    | raise exc_value.with_traceback(exc_tb)
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
    | self.dbapi_connection = connection = pool._invoke_creator(self)
    | ~~~~~~~~~~~~~~~~~~~~^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\create.py", line 646, in connect
    | return dialect.connect(*cargs, **cparams)
    | ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 622, in connect
    | return self.loaded_dbapi.connect(*cargs, **cparams)
    | ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
    | File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\psycopg2\__init__.py", line 135, in connect
    | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    | UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 103: invalid continuation byte
    +------------------------------------

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 409, in run_asgi
    result = await app( # type: ignore[func-returns-value]
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    self.scope, self.receive, self.send
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__
    return await self.app(scope, receive, send)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\errors.py", line 187, in __call__
    raise exc
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\errors.py", line 165, in __call__
    await self.app(scope, receive, _send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 177, in __call__
    with recv_stream, send_stream, collapse_excgroups():
    ~~~~~~~~~~~~~~~~~~^^
    File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.752.0_x64__qbz5n2kfra8p0\Lib\contextlib.py", line 162, in __exit__
    self.gen.throw(value)
    ~~~~~~~~~~~~~~^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_utils.py", line 82, in collapse_excgroups
    raise exc
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 179, in __call__
    response = await self.dispatch_func(request, call_next)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\slowapi\middleware.py", line 136, in dispatch
    response = await call_next(request)
    ^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 154, in call_next
    raise app_exc
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\base.py", line 141, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    raise exc
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 715, in __call__
    await self.middleware_stack(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 735, in app
    await route.handle(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 288, in handle
    await self.app(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 76, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    raise exc
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\starlette\routing.py", line 73, in app
    response = await f(request)
    ^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\routing.py", line 301, in app
    raw_response = await run_endpoint_function(
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\fastapi\routing.py", line 212, in run_endpoint_function
    return await dependant.call(**values)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\main.py", line 79, in login
    token = loginUser(email, password)
    File "C:\Users\Marcus\noCodeProj\testFastApi\db.py", line 98, in loginUser
    user = db.query(User).filter(User.email == email, User.password == password).first()
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2754, in first
    return self.limit(1)._iter().first() # type: ignore
    ~~~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2853, in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
    ~~~~~~~~~~~~~~~~~~~~^
    statement,
    ^^^^^^^^^^
    params,
    ^^^^^^^
    execution_options={"_sa_orm_load_options": self.load_options},
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2365, in execute
    return self._execute_internal(
    ~~~~~~~~~~~~~~~~~~~~~~^
    statement,
    ^^^^^^^^^^
    ...<4 lines>...
    _add_event=_add_event,
    ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2241, in _execute_internal
    conn = self._connection_for_bind(bind)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2110, in _connection_for_bind
    return trans._connection_for_bind(engine, execution_options)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "<string>", line 2, in _connection_for_bind
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1189, in _connection_for_bind
    conn = bind.connect()
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3274, in connect
    return self._connection_cls(self)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
    self._dbapi_connection = engine.raw_connection()
    ~~~~~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3298, in raw_connection
    return self.pool.connect()
    ~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 449, in connect
    return _ConnectionFairy._checkout(self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1263, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
    rec = pool._do_get()
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 179, in _do_get
    with util.safe_reraise():
    ~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 177, in _do_get
    return self._create_connection()
    ~~~~~~~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 390, in _create_connection
    return _ConnectionRecord(self)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
    self.__connect()
    ~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
    with util.safe_reraise():
    ~~~~~~~~~~~~~~~~~^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
    self.dbapi_connection = connection = pool._invoke_creator(self)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\create.py", line 646, in connect
    return dialect.connect(*cargs, **cparams)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 622, in connect
    return self.loaded_dbapi.connect(*cargs, **cparams)
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
    File "C:\Users\Marcus\noCodeProj\testFastApi\venv\Lib\site-packages\psycopg2\__init__.py", line 135, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 103: invalid continuation byte


    My code:

    in main.py:

    @app.post("/login")
    async def login(response: Response, email: str = Form(...), password: str = Form(...)):
    print(f" Tentative de connexion: {email}")

    token = loginUser(email, password)

    if token is None:
    print("❌ Identifiants invalides") # Log en cas d'erreur
    raise HTTPException(status_code=401, detail="Email ou mot de passe incorrect")

    # Stocker le token dans un cookie sécurisé
    response.set_cookie(
    key="session_token",
    value=token,
    httponly=True,
    secure=False, # En dev, mettre `False`, en prod mettre `True`
    max_age=7200 # 2 heures
    )

    print("✅ Connexion réussie, cookie défini") # Log de succès
    return {"message": "Connexion réussie", "token": token} # Log dans la console


    In db.py :

    def create_session(email):
    db = SessionLocal()
    try:
    new_session = Session(email=email)
    db.add(new_session)
    db.commit()
    db.refresh(new_session)
    return new_session.session_token # Renvoie le token
    finally:
    db.close()

    def loginUser(email, password):
    db = SessionLocal()

    user = db.query(User).filter(User.email == email, User.password == password).first()

    if not user:
    return 0000

    # Créer une session et récupérer le token
    session_token = create_session(email)
    return session_token


    My shemas :

    class User(Base):
    __tablename__ = 'USER'

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    nom = Column(String, index=True)
    prenom = Column(String, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String, index=True)


    class Dispo(Base):
    __tablename__ = 'DISPO'

    id = Column(Integer, primary_key=True, index=True)
    jour = Column(Integer, index=True)
    mois = Column(Integer, index=True)
    annee = Column(Integer, index=True)
    dispo = Column(Integer, index=True)
    userid = Column(Integer, index=True)



    class Session(Base):
    __tablename__ = 'SESSION'

    id = Column(Integer, primary_key=True, autoincrement=True)
    session_token = Column(String, unique=True, index=True, nullable=False, default=lambda: str(uuid.uuid4()))
    email = Column(String, ForeignKey('USER.email', ondelete="CASCADE"), nullable=False)
    expires_at = Column(DateTime, nullable=False, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(hours=2))

    user = relationship("User")



    And finaly, here is the way I send my data to my endpoint /login :

    <script>
    document.getElementById("loginForm").addEventListener("submit", async function(event) {
    event.preventDefault(); // Empêche le rechargement de la page

    const formData = new FormData(this);

    try {
    const response = await fetch("/login", {
    method: "POST",
    body: formData
    });

    const data = await response.json();

    // Affichage du message
    const messageElement = document.getElementById("responseMessage");
    messageElement.innerText = data.message;

    if (response.ok) {
    messageElement.style.color = "green";
    // Redirection après 2 secondes
    setTimeout(() => {
    window.location.href = "home.html";
    }, 2000);
    } else {
    messageElement.style.color = "red";
    }
    } catch (error) {
    console.error("Erreur de connexion :", error);
    document.getElementById("responseMessage").innerText = "Erreur de connexion";
    document.getElementById("responseMessage").style.color = "red";
    }
    });
    </script>

    Continue reading...

Compartilhe esta Página