Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RedirectResponse with Session failed #88

Open
paroxyste-0 opened this issue Aug 26, 2024 · 3 comments
Open

RedirectResponse with Session failed #88

paroxyste-0 opened this issue Aug 26, 2024 · 3 comments

Comments

@paroxyste-0
Copy link

paroxyste-0 commented Aug 26, 2024

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

@tarsil
Copy link
Contributor

tarsil commented Aug 26, 2024

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

Thank you for this and let me investigate. I find this quite odd actually.
Regarding your suggestion, that is a good point and we will be adding a RoutePath alias to Path as alternative in the next release. Good point.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

10 participants
@tarsil @paroxyste-0 and others