تكرار السؤال: …
الإجابة المختصرة
اقرأ الإعدادات والأسرار من متغيرات البيئة أو secret manager عند بدء التشغيل، وحوّلها إلى كائن إعدادات typed يُتحقق منه مرة واحدة، ولا تضع الأسرار في الكود أو الحزمة أو Git.
الشرح
افصل القيم الافتراضية غير الحساسة (مثل المهلات) عن بيانات الاعتماد. تحقق من الإعدادات عند الإقلاع حتى يفشل التطبيق فورًا برسالة واضحة إذا غاب سر مطلوب، بدل أن يفشل بعد ساعات عند أول استخدام. تساعد مكتبة pydantic-settings في تحويل متغيرات البيئة إلى نموذج typed، و SecretStr تمنع ظهور القيمة في السجلات و repr. لا تسجّل كل os.environ لتسهيل الـ debugging.
مثال بالكود
import os
from dataclasses import dataclass, field
@dataclass(frozen=True)
class Settings:
database_url: str = field(repr=False)
request_timeout: float = 5.0
def load_settings() -> Settings:
url = os.environ.get("DATABASE_URL")
if not url:
raise RuntimeError("DATABASE_URL is required")
return Settings(
database_url=url,
request_timeout=float(os.environ.get("REQUEST_TIMEOUT", "5")),
)أخطاء شائعة
- رفع ملف .env يحتوي أسرارًا إلى المستودع.
- قراءة os.environ في أماكن متفرقة من الكود دون تحقق مركزي.