lilya
lilya copied to clipboard
RedirectResponse with Session failed
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 :
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 :
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 :
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