-
Notifications
You must be signed in to change notification settings - Fork 11
/
login.py
74 lines (59 loc) · 2.05 KB
/
login.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
This example demonstrates a simple login/logout flow.
Required dependencies: python-multipart
Usage:
> uvicorn examples.login:app
Open http://localhost:8000 for demo page.
"""
from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.requests import Request
from starlette.responses import HTMLResponse, RedirectResponse, Response
from starlette.routing import Route
from starsessions import CookieStore, SessionAutoloadMiddleware, SessionMiddleware
from starsessions.session import regenerate_session_id
async def homepage(request: Request) -> Response:
"""Access this view (GET "/") to display session contents."""
return HTMLResponse(
"""
<form method="post" action="/login">
<label> Username <input type="text" name="username"> </label>
<button type="submit">Sign in</button>
</form>
<a href="/profile">My profile</a>
"""
)
async def login(request: Request) -> Response:
form_data = await request.form()
username = form_data["username"]
request.session["username"] = username
regenerate_session_id(request)
return RedirectResponse("/profile", 302)
async def logout(request: Request) -> Response:
request.session.clear()
return RedirectResponse("/", 302)
async def profile(request: Request) -> Response:
username = request.session.get("username")
if not username:
return RedirectResponse("/", 302)
return HTMLResponse(
"""
<p>Hi, {username}!</p>
<form method="post" action="/logout">
<button type="submit">logout</button>
</form>
""".format(
username=username
)
)
routes = [
Route("/", endpoint=homepage),
Route("/login", endpoint=login, methods=["POST"]),
Route("/logout", endpoint=logout, methods=["POST"]),
Route("/profile", endpoint=profile),
]
middleware = [
Middleware(SessionMiddleware, store=CookieStore(secret_key="secret"), cookie_https_only=False),
Middleware(SessionAutoloadMiddleware),
]
app = Starlette(debug=True, routes=routes, middleware=middleware)