from starlette.applications import Starlette from starlette.responses import HTMLResponse, RedirectResponse, JSONResponse, PlainTextResponse from starlette.routing import Route import uvicorn import datetime from asyncio import sleep html_content = """
Calling slow route via fetch() before changing page. """ async def homepage(request): return HTMLResponse(html_content) async def set_cookie_on_fetch(request): res = JSONResponse({'hello':'world'}) await sleep(5) res.set_cookie("my_cookie", "a__" + datetime.datetime.now().isoformat()) return res async def set_cookie_and_redirect(request): res = RedirectResponse("/final") res.set_cookie("my_cookie", "b__" + datetime.datetime.now().isoformat()) return res async def final(request): cookie_val = request.cookies.get('my_cookie') cookie_is_b = cookie_val.partition("__")[0] == 'b' if (cookie_is_b): res = PlainTextResponse("Cookie value is \"" + cookie_val + "\", all is well. Try refreshing the page.", 200) else: res = PlainTextResponse("Cookie value is \"" + cookie_val + "\", it shouldn't be.", 400) return res routes = [ Route('/', homepage), Route('/set_cookie_on_fetch', set_cookie_on_fetch), Route('/set_cookie_and_redirect', set_cookie_and_redirect), Route('/final', final), ] app = Starlette(debug=True, routes=routes) uvicorn.run(app, host="0.0.0.0", port=8000)