lilya icon indicating copy to clipboard operation
lilya copied to clipboard

RedirectResponse with Session failed

Open paroxyste-0 opened this issue 6 months ago • 3 comments

Hello, I have a problem when a session is active.

# For the exemple home url = '/'
async def home(request: Request):
    return view.get_template_response(
        request, '/root/home.jinja'
    )

# Login url = '/auth/login'
async def auth_login(request: Request):
    if request.method == 'GET':
        return view.get_template_response(
            request, '/auth/login.jinja'
        )
        
   if request.method == 'POST' :
       return RedirectResponse(url='/', status_code=303)

With this basic exemple i can access to login, send my form and be redirect to my home page, that's work fine :

image

image

At this moment my session is always empty :

INFO:     127.0.0.1:53040 - "GET /auth/login HTTP/1.1" 200 OK
INFO:     127.0.0.1:53063 - "POST /auth/login HTTP/1.1" 303 See Other
{}
INFO:     127.0.0.1:53063 - "GET / HTTP/1.1" 200 OK

But now if add value to session in my POST I'm having problems :

# For the exemple home url = '/'
async def home(request: Request):
    return view.get_template_response(
        request, '/root/home.jinja'
    )

# Login url = '/auth/login'
async def auth_login(request: Request):
    if request.method == 'GET':
        return view.get_template_response(
            request, '/auth/login.jinja'
        )
        
   if request.method == 'POST' :
       session = request.session
       session['test_key'] = 'test_value'

       return RedirectResponse(url='/', status_code=303)

Now if i make a POST to login route the redirect failed :

image

The traceback of error :

INFO:     127.0.0.1:53083 - "GET /auth/login HTTP/1.1" 200 OK
INFO:     127.0.0.1:53084 - "POST /auth/login HTTP/1.1" 303 See Other
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 406, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 70, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\apps.py", line 833, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\server_error.py", line 80, in __call__
    raise exc
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\server_error.py", line 75, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\sessions.py", line 71, in __call__
    await self.app(scope, receive, send_wrapper)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\app_settings.py", line 35, in __call__
    await self.app(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\exceptions.py", line 126, in __call__
    await wrap_app_handling_exceptions(self.app, connection)(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 97, in wrapped_app
    raise exc
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 86, in wrapped_app
    await app(scope, receive, sender)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 1590, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 1430, in app
    await self.handle_route(route, path_handler=path_handler)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 1333, in handle_route
    await route.handle_dispatch(path_handler.scope, path_handler.receive, path_handler.send)  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 491, in handle_dispatch
    await self.handle_exception_handlers(scope, receive, send, ex)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 183, in handle_exception_handlers
    await self._handle_http_exception(scope, receive, send, exc, status_code)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 217, in _handle_http_exception
    raise exc
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\routing.py", line 487, in handle_dispatch
    await self.app(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_responses.py", line 86, in app
    await wrap_app_handling_exceptions(inner_app, request)(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 97, in wrapped_app
    raise exc
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 86, in wrapped_app
    await app(scope, receive, sender)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_responses.py", line 84, in inner_app
    await self._handle_response_content(response, scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_responses.py", line 106, in _handle_response_content
    await app(scope, receive, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\responses.py", line 230, in __call__
    await send({"type": prefix + "http.response.body", "body": self.body})
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 83, in sender
    await send(message)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\_internal\_exception_handlers.py", line 83, in sender
    await send(message)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\sessions.py", line 69, in send_wrapper
    await self.process_response(message, scope, initial_session_was_empty, send)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\sessions.py", line 118, in process_response
    await send(message)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\lilya\middleware\server_error.py", line 72, in _send
    await send(message)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 510, in send
    output = self.conn.send(event=h11.EndOfMessage())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\h11\_connection.py", line 512, in send
    data_list = self.send_with_data_passthrough(event)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\h11\_connection.py", line 545, in send_with_data_passthrough
    writer(event, data_list.append)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\h11\_writers.py", line 67, in __call__
    self.send_eom(event.headers, write)
  File "C:\Users\Administrator\Documents\projets\lylia-poc\.venv\Lib\site-packages\h11\_writers.py", line 96, in send_eom
    raise LocalProtocolError("Too little data for declared Content-Length")
h11._util.LocalProtocolError: Too little data for declared Content-Length

If i force to go on my home route now i got a plain/text response with my template :

image

But I receive the session data perfectly :

{'test_key': 'test_value'}
INFO:     127.0.0.1:53103 - "GET / HTTP/1.1" 200 OK

if I delete my session everything returns to normal and the pages load correctly again.

PS : the session middleware has been installed as follows:

view: Jinja2Template = Jinja2Template(directory='templates')

routes: list = [
    Path('/',                 handler=home,             methods=['GET']),
    Path('/auth/login',       handler=auth_login,       methods=['GET', 'POST']),

    Include('/static', app=StaticFiles(directory='static'), name='static'),
]

middlewares: list = [
    DefineMiddleware(SessionMiddleware, secret_key='SECRET-KEY')
]

app: Lilya = Lilya(routes=routes, middleware=middlewares)

I'd also like to make a small suggestion concerning from lilya.routing import Path, pathlib being a commonly used library and having it important I had problems when I launched my application, Lilya's Path import conflicted with my Path import from pathlib and I find this rather misleading, perhaps it would be wise to rename Path to Router or PathRoute to avoid confusion.

Best regards

paroxyste-0 avatar Aug 26 '24 08:08 paroxyste-0