Python Academy · درس

حقن الاعتماديات والمصادقة

استخدم نظام DI في FastAPI للمنطق المشترك والمصادقة المعتمدة على JWT

الدرس 3 من 413 خطوة

حقن الاعتماديات والمصادقة درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

ما هو حقن الاعتماديات؟

تتيح لك Depends() في FastAPI تعريف منطق مشترك، مثل جلسات DB وفحوصات المصادقة والإعدادات، ليُحقن تلقائيًا في معالجات المسارات.

from fastapi import FastAPI, Depends
app = FastAPI()

def get_db():
    db = connect_db()
    try: yield db
    finally: db.close()

@app.get("/users")
def list_users(db = Depends(get_db)):
    return db.query_all("users")

دوال الاعتماديات

الاعتمادية هي أي كائن قابل للاستدعاء. ويمكن أن تكون دالة أو فئة أو دالة أخرى تستخدم اعتمادية.

from fastapi import Depends, FastAPI
app = FastAPI()

def common_params(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

@app.get("/items")
def list_items(params: dict = Depends(common_params)):
    return params

@app.get("/users")
def list_users(params: dict = Depends(common_params)):
    return params

اعتماديات الفئات

استخدم فئة بوصفها اعتمادية لتجميع الإعدادات المرتبطة. وتُستدعى الفئة مع حقن وسيطات __init__ الخاصة بها.

from fastapi import Depends, FastAPI, Query
app = FastAPI()

class Pagination:
    def __init__(self, page: int = Query(1,ge=1), size: int = Query(10,ge=1,le=100)):
        self.page = page
        self.size = size
        self.offset = (page - 1) * size

@app.get("/items")
def list_items(pag: Pagination = Depends()):
    return {"offset": pag.offset, "size": pag.size}

OAuth2 Password Bearer

استخدم OAuth2PasswordBearer لقراءة رمز Bearer من ترويسة Authorization.

from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()

oauth2 = OAuth2PasswordBearer(tokenUrl="/token")

@app.get("/me")
def me(token: str = Depends(oauth2)):
    return {"token": token}   # validate token here

رموز JWT

أنشئ رموز JWT وتحقق منها باستخدام python-jose (أو pyjwt). وأرجع رمزًا عند تسجيل الدخول، ثم تحقّق منه في كل مسار محمي.

# pip install python-jose passlib
from jose import jwt, JWTError

SECRET_KEY = "change-me"
ALGORITHM = "HS256"

def create_token(data: dict) -> str:
    return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)

def verify_token(token: str) -> dict:
    return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])

اعتمادية المستخدم الحالي

أنشئ اعتمادية get_current_user تتحقق من JWT وتُرجع المستخدم الذي تمت مصادقته.

from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError

oauth2 = OAuth2PasswordBearer(tokenUrl="/token")

def get_current_user(token: str = Depends(oauth2)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return payload["sub"]
    except JWTError:
        raise HTTPException(status_code=401, detail="Invalid token")

# @app.get("/me")
# def me(user=Depends(get_current_user)): return user

تجزئة كلمات المرور

لا تخزّن كلمات المرور بصيغتها الصريحة مطلقًا. استخدم passlib لتجزئتها باستخدام bcrypt.

from passlib.context import CryptContext

pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_pw(plain: str) -> str:
    return pwd_ctx.hash(plain)

def verify_pw(plain: str, hashed: str) -> bool:
    return pwd_ctx.verify(plain, hashed)

نقطة نهاية الرمز

نفّذ POST /token لقبول بيانات اعتماد النموذج، والتحقق من كلمة المرور، وإرجاع JWT.

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()

@app.post("/token")
def login(form: OAuth2PasswordRequestForm = Depends()):
    user = get_user_by_username(form.username)
    if not user or not verify_pw(form.password, user.hashed_pw):
        raise HTTPException(status_code=401, detail="Bad credentials")
    token = create_token({"sub": form.username})
    return {"access_token": token, "token_type": "bearer"}

المصادقة باستخدام مفتاح API

في الحالات الأبسط، تحقّق من مفتاح API موجود في ترويسة أو معامل استعلام.

from fastapi import Depends, HTTPException, Security
from fastapi.security import APIKeyHeader

API_KEY_HEADER = APIKeyHeader(name="X-API-Key")

def require_api_key(key: str = Security(API_KEY_HEADER)):
    if key != "secret-key":
        raise HTTPException(status_code=403, detail="Forbidden")
    return key

التحكم في الوصول المستند إلى الأدوار

أضف طبقة صلاحيات فوق المصادقة بإضافة فحوصات الأدوار إلى الاعتماديات.

from fastapi import Depends, HTTPException

def require_admin(user=Depends(get_current_user)):
    if user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Admins only")
    return user

# @app.delete("/users/{uid}")
# def delete_user(uid: int, admin=Depends(require_admin)):

تخزين الاعتماديات مؤقتًا

تُستدعى الاعتمادية مرة واحدة لكل طلب افتراضيًا، وتُشارك نتيجتها بين جميع المسارات التي تستخدمها ضمن ذلك الطلب.

# The same db session object is shared:
@app.get("/summary")
def summary(
    db = Depends(get_db),      # db resolved once
    stats = Depends(get_stats) # get_stats also uses get_db — same db instance
): ...

تحقق سريع

ماذا تفعل Depends() في FastAPI؟

مراجعة

استخدم Depends(func) لحقن المنطق المشترك. أنشئ المصادقة باستخدام OAuth2PasswordBearer ورموز JWT وتبعية get_current_user. جزّئ كلمات المرور باستخدام passlib/bcrypt. أضف فحوصات الأدوار باعتبارها تبعيات إضافية.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
76
الدروس
320

الأسئلة الشائعة

هل درس «حقن الاعتماديات والمصادقة» مجاني؟

نعم — نص درس «حقن الاعتماديات والمصادقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «حقن الاعتماديات والمصادقة»؟

استخدم نظام DI في FastAPI للمنطق المشترك والمصادقة المعتمدة على JWT تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «حقن الاعتماديات والمصادقة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد مشروع FastAPI ونقطة النهاية الأولى
  2. معاملات المسار ومعاملات الاستعلام وأجسام الطلبات
  3. حقن الاعتماديات والمصادقة
  4. نقاط النهاية غير المتزامنة وتكامل قواعد البيانات
← العودة إلى Python Academy