microdot.login --- تدفق تسجيل دخول المستخدم¶
غلاف عالي المستوى حول microdot.session ينفذ تدفق تسجيل الدخول التقليدي باسم المستخدم / كلمة المرور: دالة رد نداء user loader تربط معرّف المستخدم المخزن في الجلسة بكائن المستخدم في التطبيق، ومزخرفات المسار تعيد توجيه الطلبات غير المُصادق عليها إلى عنوان URL قابل للتهيئة لتسجيل الدخول، وملفات تعريف ارتباط "تذكرني" الاختيارية تتيح للزوار العائدين البقاء مسجلي الدخول عبر جلسات المتصفح.
يتطلب تهيئة microdot.session على التطبيق قبل بناء كائن تسجيل الدخول -- فالجلسة هي المكان الذي يُخزَّن فيه معرّف المستخدم.
class Login¶
- class microdot.login.Login(login_url: str = '/login')¶
- login_url
عنوان URL الذي يعيد المزخرف توجيه الطلبات غير المُصادق عليها إليه. يوفر التطبيق نموذج/معالج تسجيل الدخول الفعلي على هذا المسار. الافتراضي
'/login'.
- user_loader(f)¶
مزخرف يسجل دالة رد نداء محلِّل المستخدم. يأخذ f معرّف المستخدم المخزن في الجلسة ويُرجع كائن المستخدم (أو
Noneإذا لم يعد المعرّف صالحاً -- حساب محذوف، أو جلسة مُلغاة، إلخ).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)¶
زخرفة مسار بنسخة
Loginتحميه خلف المصادقة:@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
تُعاد توجيه الطلبات غير المُصادق عليها إلى login_url مع معامل استعلام
?next=<original-url>لكي يتمكن معالج تسجيل الدخول من إعادة المستخدم إلى حيث أتى.
- fresh(f)¶
مثل
__call__()، لكنه يرفض الجلسات المستعادة من ملف تعريف ارتباط "تذكرني" -- يجب أن يكون المستخدم قد سجل دخوله صراحةً منذ آخر تسجيل دخول كامل. يُستخدم لحماية المسارات الحساسة (تغيير كلمة المرور، حذف الحساب) بحيث لا يستطيع ملف تعريف ارتباط "تذكرني" المسروق الوصول إليها.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')¶
تحديد user كمسجِّل دخول لـ request. يخزن معرّف المستخدم في الجلسة ويُرجع استجابة إعادة توجيه.
- user
كائن المستخدم المُرجَع من محمِّل المستخدم. يجب أن يحمل سمة
id.- remember
إذا كانت قيمته صادقة، يضبط أيضاً ملف تعريف ارتباط
_rememberطويل الأمد. مررTrueلمدة 30 يوماً الافتراضية، أو عدداً صحيحاً لعدد الأيام التي يجب أن يدوم فيها ملف تعريف الارتباط.- redirect_url
إلى أين يُعاد التوجيه بعد تسجيل الدخول. يتجاوزه
?next=<url>من الطلب الأصلي إذا كان يشير إلى مسار في الموقع نفسه.
يُرجع استجابة إعادة التوجيه -- أرجع قيمتها من معالج مسار تسجيل الدخول.
- async logout_user(request)¶
مسح معرّف المستخدم من الجلسة وإزالة أي ملف تعريف ارتباط
_remember. استخدمه من مسار/logout@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)¶
إرجاع كائن المستخدم المسجِّل دخوله حالياً (أو
None). يُخزَّن في الذاكرة علىrequest.g.current_userبحيث تصل الاستدعاءات المتكررة ضمن طلب واحد إلى المحمِّل مرة واحدة فقط.
مثال¶
تدفق تسجيل دخول مبسّط:
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 هو نفسه JWT موقّع (باستخدام السر الخاص بالجلسة)، لذا لا يمكن إعادة استخدام ملف تعريف ارتباط مسروق على تطبيق مختلف أو بعد تدوير السر.