microdot.login — användarinloggningsflöde¶
En omslutning på högre nivå kring microdot.session som implementerar det konventionella inloggningsflödet med användarnamn/lösenord: ett återanrop för användarladdning mappar sessionens lagrade användar-id tillbaka till applikationens användarobjekt, rutt-dekoratorer omdirigerar oautentiserade begäranden till en konfigurerbar inloggnings-URL, och valfria ”kom ihåg mig”-cookies låter återkommande besökare förbli inloggade över webbläsarsessioner.
Kräver att microdot.session initieras på applikationen innan login-objektet konstrueras – sessionen är där användar-id lagras.
class Login¶
- class microdot.login.Login(login_url: str = '/login')¶
- login_url
URL som dekoratorn omdirigerar oautentiserade begäranden till. Applikationen tillhandahåller det faktiska inloggningsformuläret/hanteraren på denna rutt. Standard
'/login'.
- user_loader(f)¶
Dekorator som registrerar återanropet för användaruppslagning. f tar användar-id som lagrats i sessionen och returnerar användarobjektet (eller
Noneom id:t inte längre är giltigt – ett raderat konto, en återkallad session osv.).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)¶
Att dekorera en rutt med
Login-instansen spärrar den bakom autentisering:@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
Oautentiserade begäranden omdirigeras till login_url med en frågeparameter
?next=<original-url>så att inloggningshanteraren kan skicka tillbaka användaren dit den kom ifrån.
- fresh(f)¶
Som
__call__(), men avvisar sessioner som återställts från en ”kom ihåg mig”-cookie – användaren måste ha loggat in uttryckligen sedan den senaste fullständiga inloggningen. Används för att spärra känsliga rutter (lösenordsbyte, kontoradering) så att en stulen kom-ihåg-mig-cookie inte kan nå dem.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')¶
Markera user som inloggad för request. Lagrar användar-id i sessionen och returnerar ett omdirigeringssvar.
- user
Användarobjektet som returneras av användarladdaren. Måste ha ett
id-attribut.- remember
Om sant, sätt också en långlivad
_remember-cookie. SkickaTrueför standardvärdet 30 dagar, eller ett heltal för antalet dagar cookien ska vara giltig.- redirect_url
Vart omdirigeringen ska ske efter inloggning. Åsidosätts av
?next=<url>från den ursprungliga begäran om den pekar på en sökväg på samma webbplats.
Returnerar omdirigeringssvaret – returnera dess värde från inloggningsruttens hanterare.
- async logout_user(request)¶
Rensa användar-id från sessionen och ta bort eventuell
_remember-cookie. Använd från en/logout-rutt:@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)¶
Returnera det för närvarande inloggade användarobjektet (eller
None). Memoiserat pårequest.g.current_userså att upprepade anrop inom en begäran träffar laddaren endast en gång.
Exempel¶
Ett minimalt inloggningsflöde:
from microdot import Microdot, redirect
from microdot.session import Session
from microdot.login import Login
app = Microdot()
Session(app, secret_key=load_secret())
login = Login()
@login.user_loader
async def load_user(user_id):
return users.get(user_id)
@app.get('/login')
async def login_page(request):
return Response.send_file('static/login.html')
@app.post('/login')
async def do_login(request):
user = authenticate(request.form['user'], request.form['pass'])
if not user:
return redirect('/login?error=1')
return await login.login_user(request, user, remember=True)
@app.get('/dashboard')
@login
async def dashboard(request):
return 'hi ' + request.g.current_user.name
@app.post('/logout')
async def logout(request):
await login.logout_user(request)
return redirect('/')
_remember-cookien är själv en signerad JWT (med sessionens hemlighet), så en stulen cookie kan inte återanvändas på en annan applikation eller efter att hemligheten har roterats.