أساسيات Flask
Flask Basics
أساسيات Flask — Flask Basics
في الدرس السابق، أرسلتَ طلبات إلى خوادم. الآن حان دورك أن تبني الخادم. Flask هو أحد أبسط أطر عمل الويب في Python — بضعة أسطر تكفي لبناء خادم حقيقي يستجيب للطلبات.
ما هو Flask؟
Flask هو إطار عمل ويب خفيف (micro web framework). “خفيف” تعني أنه لا يجبرك على هيكل معين — تأخذ ما تحتاجه وتتحكم في كل شيء. لا قاعدة بيانات مدمجة، لا نظام قوالب معقد، لا قرارات مفروضة. هذا ما جعله الخيار المفضل للمشاريع الصغيرة وNPAs (APIs) والتعلم.
تطبيقات كبيرة مثل Pinterest وLinkedIn بدأت بـ Flask. Netflix تستخدمه في بعض خدماتها الداخلية.
تثبيت Flask
pip install flask
أبسط تطبيق Flask
from flask import Flask
# إنشاء التطبيق — Create the application
app = Flask(__name__)
# تعريف مسار — Define a route
@app.route("/")
def home():
return "مرحباً بالعالم!"
# تشغيل الخادم — Run the server
if __name__ == "__main__":
app.run(debug=True)
ملاحظة مهمة حول Pyodide و Flask
Flask يعمل بالكامل داخل Pyodide عبر micropip.install('flask'). لكن تشغيل خادم حقيقي بـ app.run() داخل المتصفح غير ممكن — المتصفح لا يفتح منافذ شبكية. الحل العملي المستخدم في هذا الدرس: Flask Test Client — أداة مدمجة في Flask تتيح استدعاء handlers مباشرة بدون خادم حقيقي. هذه الأداة نفسها تُستخدم في اختبارات الإنتاج، لذا ما تتعلمه هنا مهارة حقيقية.
# بدلاً من تشغيل الخادم — Instead of running the server:
with app.test_client() as client:
response = client.get("/")
print(response.get_data(as_text=True)) # مرحباً بالعالم!
تطبيق Flask مع test_client
دعنا نبني ونختبر مباشرة:
رمز الحالة في الاستجابة
Flask يُعيد 200 افتراضياً. تستطيع تغييره بإعادة tuple:
@app.route("/users/<int:user_id>")
def get_user(user_id):
if user_id not in database:
return "غير موجود", 404 # (body, status_code)
return f"المستخدم {user_id}" # 200 افتراضياً
معاملات الاستعلام — Query Parameters
معاملات مثل ?page=2&sort=name تصل عبر request.args:
from flask import Flask, request
app = Flask(__name__)
@app.route("/search")
def search():
# ?q=python&page=1
query = request.args.get("q", "") # الاستعلام — search term
page = request.args.get("page", "1") # الصفحة — page number
return f"بحث عن: {query} (صفحة {page})"
أساليب HTTP — HTTP Methods
افتراضياً @app.route يقبل GET فقط. تحدد الأساليب المقبولة بـ methods:
@app.route("/submit", methods=["GET", "POST"])
def submit():
if request.method == "POST":
name = request.form.get("name")
return f"استُقبل: {name}"
return "أرسل نموذجاً"
الترويسات في الاستجابة — Response Headers
تستطيع ضبط الترويسات مباشرة:
from flask import Flask, make_response
@app.route("/download")
def download():
response = make_response("محتوى الملف")
response.headers["Content-Disposition"] = "attachment; filename=file.txt"
return response
نمط البناء التدريجي
الإيجابية الكبيرة في Flask أنه يسمح لك بالبدء بشيء صغير جداً وتوسيعه:
المرحلة 1 — مسار واحد:
@app.route("/")
def home():
return "مرحباً"
المرحلة 2 — أضف مسارات:
@app.route("/about")
def about():
return "عن الموقع"
المرحلة 3 — أضف بيانات ديناميكية:
@app.route("/users/<int:uid>")
def user(uid):
return f"المستخدم {uid}"
المرحلة 4 — أضف JSON وستجد نفسك تبني API كامل — وهذا موضوع الدرس القادم.