microdot.login — kullanıcı oturum açma akışı¶
microdot.session üzerine, geleneksel kullanıcı adı / parola oturum açma akışını uygulayan daha üst düzey bir sarmalayıcı: bir user loader geri çağırması, oturumda saklanan kullanıcı kimliğini uygulamanın kullanıcı nesnesine geri eşler, rota dekoratörleri kimliği doğrulanmamış istekleri yapılandırılabilir bir oturum açma URL’sine yönlendirir ve isteğe bağlı “beni hatırla” çerezleri, geri dönen ziyaretçilerin tarayıcı oturumları arasında oturumlarını açık tutmasını sağlar.
Login nesnesi oluşturulmadan önce uygulamada microdot.session modülünün başlatılmış olmasını gerektirir – kullanıcı kimliği oturumda saklanır.
class Login¶
- class microdot.login.Login(login_url: str = '/login')¶
- login_url
Dekoratörün kimliği doğrulanmamış istekleri yönlendirdiği URL. Uygulama, gerçek oturum açma formunu/işleyicisini bu rotada sağlar. Varsayılan
'/login'.
- user_loader(f)¶
Kullanıcı çözümleyici geri çağırmasını kaydeden dekoratör. f, oturumda saklanan kullanıcı kimliğini alır ve kullanıcı nesnesini döndürür (veya kimlik artık geçerli değilse
None– silinmiş bir hesap, iptal edilmiş bir oturum vb.).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)¶
Bir rotayı
Loginörneğiyle dekore etmek onu kimlik doğrulamasının arkasına alır:@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
Kimliği doğrulanmamış istekler, oturum açma işleyicisinin kullanıcıyı geldiği yere geri gönderebilmesi için
?next=<original-url>sorgu parametresiyle birlikte login_url adresine yönlendirilir.
- fresh(f)¶
Tıpkı
__call__()gibi, ancak bir “beni hatırla” çerezinden geri yüklenen oturumları reddeder – kullanıcının son tam oturum açmadan bu yana açıkça oturum açmış olması gerekir. Çalınmış bir beni-hatırla çerezinin ulaşamaması için hassas rotaları (parola değiştirme, hesap silme) korumak amacıyla kullanılır.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')¶
request için user öğesini oturum açmış olarak işaretler. Kullanıcı kimliğini oturumda saklar ve bir yönlendirme yanıtı döndürür.
- user
Kullanıcı yükleyici tarafından döndürülen kullanıcı nesnesi. Bir
idözniteliğine sahip olmalıdır.- remember
Doğru ise, ek olarak uzun ömürlü bir
_rememberçerezi de ayarlar. Varsayılan 30 gün içinTrue, veya çerezin kaç gün süreceğini belirtmek için bir tam sayı geçirin.- redirect_url
Oturum açtıktan sonra nereye yönlendirileceği. Orijinal istekten gelen
?next=<url>aynı siteye ait bir yolu işaret ediyorsa onun tarafından geçersiz kılınır.
Yönlendirme yanıtını döndürür – değerini oturum açma rota işleyicisinden döndürün.
- async logout_user(request)¶
Kullanıcı kimliğini oturumdan temizler ve varsa
_rememberçerezini kaldırır. Bir/logoutrotasından kullanın:@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)¶
O anda oturum açmış olan kullanıcı nesnesini (veya
None) döndürür.request.g.current_userüzerinde belleğe alınır; böylece tek bir istek içindeki tekrarlanan çağrılar yükleyiciye yalnızca bir kez ulaşır.
Örnek¶
Minimal bir oturum açma akışı:
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 çerezinin kendisi imzalı bir JWT’dir (oturumun gizli anahtarını kullanır); böylece çalınmış bir çerez farklı bir uygulamada veya gizli anahtar döndürüldükten sonra yeniden kullanılamaz.