أهلاً بك مرة أخرى!
في الدرس السابق، قمنا بخطوة كبيرة نحو التعامل مع واجهات برمجة التطبيقات (APIs) الحقيقية بتعلم كيفية استخدام مفاتيح API للمصادقة. لكننا أنهينا الدرس بملاحظة تحذيرية هامة: كتابة مفتاح الـ API مباشرة في الكود، أو ما يسمى بـ "التشفير الصلب" (Hardcoding)، هي ممارسة خطيرة جداً.
تخيل أن كودك هو دفتر ملاحظاتك، ومفتاح الـ API هو كلمة مرور حسابك البنكي. هل ستكتب كلمة المرور هذه في كل صفحة من دفتر ملاحظاتك ثم تعطيه لأي شخص ليقرأه؟ بالطبع لا! هذا بالضبط ما يحدث عند كتابة المفاتيح السرية في الكود ومشاركته.
اليوم، سنتعلم الحل الاحترافي والآمن لهذه المشكلة. هدفنا هو تأمين مفاتيح API والبيانات الحساسة باستخدام متغيرات البيئة (Environment Variables). هذه المهارة ليست مجرد "أفضل ممارسة"، بل هي ضرورة أساسية لأي مبرمج يتعامل مع بيانات حساسة. بنهاية هذا الدرس، ستكون قادراً على فصل أسرارك عن الكود الخاص بك، مما يجعله آمناً للمشاركة والتعاون.
1. ما هي متغيرات البيئة؟ ولماذا هي الحل؟
متغيرات البيئة هي ببساطة متغيرات يتم تخزين قيمها خارج البرنامج، في "البيئة" التي يعمل فيها الكود (سواء كانت نظام التشغيل الخاص بك أو خادم الويب).
الفكرة الرئيسية هي فصل الإعدادات (Configuration) عن الكود (Code).
- الكود: يحتوي على المنطق والإجراءات (ماذا يفعل البرنامج).
- الإعدادات: تحتوي على القيم التي قد تتغير، مثل مفاتيح الـ API، كلمات مرور قواعد البيانات، أو إعدادات خاصة ببيئة التشغيل (تطوير، إنتاج، إلخ).
إدارة المتغيرات البيئية في بايثون: دليل شامل مع أمثلة عملية
يقدم المقال التالي باللغة العربية شرحاً ممتازاً لأهمية متغيرات البيئة. اقرأ الأجزاء الأولى منه لتكوين فهم أساسي للمفهوم.
اقرأ الأقسام التالية: "2. ما هي المتغيرات البيئية؟" لفهم التعريف والأهمية. "3. الحصول على المتغيرات البيئية وتعيينها في بايثون" للتعرف على وحدة os التي تستخدمها بايثون للتعامل مع هذه المتغيرات.
كما قرأت، الميزة الأمنية هي الأهم: يمكننا الآن مشاركة الكود الخاص بنا بأمان، وكل شخص يستخدم الكود يقوم بتوفير متغيرات البيئة الخاصة به بشكل منفصل.
2. الحل العملي: مكتبة python-dotenv
بينما يمكن تعيين متغيرات البيئة على مستوى نظام التشغيل، فإن الطريقة الأكثر شيوعاً وسهولة لإدارتها داخل مشروع بايثون هي باستخدام مكتبة python-dotenv.
هذه المكتبة تسمح لنا بإنشاء ملف نصي بسيط اسمه .env داخل مجلد المشروع، ونضع فيه كل متغيراتنا الحساسة. ثم، يقوم الكود الخاص بنا بقراءة هذا الملف وتحميل المتغيرات منه عند بدء التشغيل.

دعنا نستعرض الخطوات بالتفصيل. الفيديو التالي من قناة Corey Schafer يعتبر من أفضل الشروحات لهذا الموضوع. سنشاهده على أجزاء لتطبيق كل خطوة.
Python Tutorial: Securely Manage Passwords and API Keys with DotEnv
يشرح هذا الفيديو بالتفصيل سبب وكيفية استخدام مكتبة python-dotenv لإدارة المتغيرات البيئة بشكل آمن. سنبدأ بالجزء الذي يوضح المشكلة والفوائد.
شاهد من البداية حتى الدقيقة 01:39. ركز على الأسباب التي تجعل هذه الطريقة أفضل من كتابة المفاتيح في الكود مباشرة أو تعيينها على مستوى النظام.
الآن بعد أن فهمنا الفائدة، لنبدأ بالتطبيق العملي.
الخطوة 1: تثبيت المكتبة
كالعادة، نستخدم pip لتثبيت المكتبة التي نحتاجها.
pip install python-dotenv
الخطوة 2: إنشاء ملف .env
في نفس المجلد الذي يوجد فيه ملف البايثون الخاص بك، قم بإنشاء ملف جديد وسمّه بالضبط .env (تبدأ التسمية بنقطة). داخل هذا الملف، اكتب المتغيرات التي تريدها على شكل KEY=VALUE، كل متغير في سطر جديد.
لنفترض أننا نريد تخزين مفتاح API الذي استخدمناه في الدرس السابق:
# .env file
WEATHER_API_KEY="my-secret-weather-key"
ملاحظات:
- لا تضع مسافات حول علامة
=. - من الجيد وضع القيم النصية بين علامتي اقتباس
"، خاصة إذا كانت تحتوي على رموز خاصة. - الأسماء تُكتب عادة بأحرف كبيرة (UPPERCASE) للفصل بين الكلمات بـ
_.
الخطوة 3: (الأهم على الإطلاق) تجاهل ملف .env
الآن لدينا ملف يحتوي على أسرارنا. إذا كنا نستخدم نظام إدارة الإصدارات مثل Git لمشاركة الكود (وهو ما يفعله كل المبرمجين تقريباً)، فيجب أن نتأكد من أن Git يتجاهل هذا الملف ولا يقوم برفعه أبداً إلى منصات مثل GitHub.
نفعل ذلك عن طريق إنشاء ملف آخر اسمه .gitignore (يبدأ بنقطة أيضاً) ونكتب بداخله اسم الملف الذي نريد تجاهله.
محتويات ملف .gitignore:
.env
هذا كل شيء! الآن Git سيتجاهل تماماً وجود ملف .env ولن يقوم بتتبعه أو مشاركته أبداً. هذه الخطوة حاسمة ولا يمكن الاستغناء عنها.
الخطوة 4: تحميل المتغيرات في كود بايثون
الآن الجزء الأخير، وهو قراءة هذه المتغيرات من داخل الكود.
# main.py
from dotenv import load_dotenv # 1. استيراد الدالة
import os # 2. استيراد مكتبة os للتعامل مع نظام التشغيل
# 3. تحميل المتغيرات من ملف .env
load_dotenv()
# 4. الوصول إلى المتغير باستخدام os.getenv()
api_key = os.getenv("WEATHER_API_KEY")
# الآن يمكنك استخدام المتغير api_key بأمان
print(f"المفتاح الذي تم تحميله هو: {api_key}")
# سيطبع: The loaded key is: my-secret-weather-key
# إذا حاولت طباعة مفتاح غير موجود، سيعيد None
non_existent_key = os.getenv("FAKE_KEY")
print(f"المفتاح غير الموجود: {non_existent_key}")
# سيطبع: The non-existent key is: None
بهذه الطريقة، لا يظهر المفتاح السري في أي مكان داخل ملف main.py.
الآن، شاهد الفيديو التالي الذي يطبق هذه الخطوات عملياً.
Python Tutorial: Securely Manage Passwords and API Keys with DotEnv
لنعد إلى فيديو Corey Schafer لنرى تطبيقاً عملياً للخطوات التي ناقشناها.
شاهد من الدقيقة 01:39 حتى الدقيقة 06:45. هذا الجزء يغطي: التثبيت (pip install). إنشاء ملف .env وملف .gitignore (أهم جزء). تحميل المتغيرات باستخدام load_dotenv() و os.getenv().
3. لنقم بتحديث كود الدرس السابق
تتذكر تمرين "اختبر فهمك" من الدرس الماضي؟ كان الكود يبدو هكذا:
# الكود القديم (غير آمن)
import requests
url = "https://api.weather.com/v1/current?city=Riyadh"
api_key = "my-secret-weather-key" # <-- مشكلة!
headers = {
"x-api-key": api_key
}
response = requests.get(url, headers=headers)
print(response.status_code)
الآن، لنعد كتابته بالطريقة الآمنة:
1. ملف .env:
WEATHER_API_KEY="my-secret-weather-key"
2. ملف .gitignore:
.env
3. ملف main.py المحدّث:
# الكود الجديد (آمن)
import requests
import os
from dotenv import load_dotenv
load_dotenv() # تحميل المتغيرات
url = "https://api.weather.com/v1/current?city=Riyadh"
api_key = os.getenv("WEATHER_API_KEY") # <-- آمن! لا توجد قيمة سرية هنا
# التأكد من أن المفتاح تم تحميله قبل استخدامه
if not api_key:
raise ValueError("لم يتم العثور على مفتاح API. تأكد من وجود ملف .env صحيح.")
headers = {
"x-api-key": api_key
}
response = requests.get(url, headers=headers)
print(f"تم إرسال الطلب، رمز الحالة: {response.status_code}")
لاحظ كيف أصبح الكود الآن نظيفاً وآمناً. يمكننا مشاركة main.py مع العالم دون قلق.
اختبر فهمك!
لديك خدمة جديدة تتطلب متغيرين:
- معرّف المستخدم (User ID)، واسمه في النظام هو
APP_USER_IDوقيمتهuser-9876. - مفتاح سري (Secret Token)، واسمه في النظام هو
APP_SECRET_TOKENوقيمتهzxcvbnm-asdfghjkl.
المطلوب:
- اكتب محتويات ملف
.envلتخزين هذين المتغيرين. - اكتب كود بايثون الذي يقوم بتحميل هذين المتغيرين وتخزينهما في متغيرين باسم
user_idوsecret_tokenعلى التوالي، ثم يطبعهما.
أظهر الإجابة
1. محتويات ملف .env:
APP_USER_ID="user-9876"
APP_SECRET_TOKEN="zxcvbnm-asdfghjkl"
2. كود بايثون:
import os
from dotenv import load_dotenv
load_dotenv()
user_id = os.getenv("APP_USER_ID")
secret_token = os.getenv("APP_SECRET_TOKEN")
print(f"User ID: {user_id}")
print(f"Secret Token: {secret_token}")
ملخص الدرس وأهم النقاط
تهانينا! لقد أتقنت اليوم واحدة من أهم المهارات العملية في البرمجة الحديثة. لقد أنهينا الآن الوحدة الثانية بالكامل، وأصبحت لديك كل الأدوات الأساسية للتعامل مع أي API بشكل احترافي وآمن.
أهم النقاط التي استخلصناها:
- متغيرات البيئة تفصل الإعدادات والبيانات الحساسة عن الكود المصدري.
- مكتبة
python-dotenvهي الطريقة القياسية لإدارة متغيرات البيئة الخاصة بالمشروع. - سير العمل الآمن يتكون من 4 خطوات:
- تثبيت
python-dotenv. - إنشاء ملف
.envووضع الأسرار فيه. - إنشاء ملف
.gitignoreوإضافة.envإليه (الأهم). - استخدام
load_dotenv()وos.getenv()في الكود.
- تثبيت
- لا تكتب أبداً مفاتيح API أو كلمات المرور أو أي معلومات حساسة أخرى مباشرة في الكود الخاص بك.
ما التالي؟
لقد أكملت بنجاح الوحدة الثانية الخاصة بالتعامل مع البيانات وواجهات برمجة التطبيقات. أنت الآن جاهز للانتقال إلى قلب موضوعنا: الذكاء الاصطناعي.
في الدرس القادم، سنبدأ الوحدة الثالثة وسنغوص في عالم المفاهيم. سنبدأ بالتمييز بين المصطلحات الكبيرة: الذكاء الاصطناعي (AI)، والتعلم الآلي (Machine Learning)، ونماذج اللغة الكبيرة (LLMs). هذا سيمهد الطريق لفهم "العقل" الذي سنضعه داخل وكلائنا. استعد لرحلة ممتعة في عالم الذكاء