إطار Sanic: إطار ويب غير متزامن سريع بلغة Python

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة عن Sanic

Sanic هو إطار ويب غير متزامن حديث للغة Python، صُمم لبناء تطبيقات ويب عالية الأداء. يعتمد على asyncio، مما يسمح بمعالجة آلاف الاتصالات المتزامنة بكفاءة بفضل دعم صياغة async/await. Sanic مثالي لبناء REST APIs، والميكروسيرفيسات، والتطبيقات في الوقت الفعلي، والخوادم الخلفية ذات الأحمال العالية.

الميزات الرئيسية لـ Sanic

الأداء والهندسة المعمارية

تم بناء Sanic مع التركيز على سرعة التنفيذ. يستخدم الإطار asyncio للمعالجة غير المتزامنة للطلبات، مما يحقق أداءً مشابهاً لـ Node.js و Go. الدعم المدمج لـ async/await يجعل الكود أكثر قابلية للقراءة والكفاءة.

الإمكانيات الوظيفية

  • دعم كامل لـ async/await مباشرة من الصندوق
  • توجيه مع معلمات و middleware
  • دعم مدمج لـ WebSocket
  • نظام قوالب ومعالجة الملفات الثابتة
  • دعم CORS وملفات تعريف الارتباط والجلسات
  • هيكل مشروع بسيط وواضح
  • قابلية توسع ممتازة لخوادم API

التثبيت والإعداد الأولي

التثبيت الأساسي

pip install sanic

التبعيات الإضافية

pip install sanic[ext]  # الإضافات
pip install jinja2 aiofiles python-dotenv

إنشاء أول تطبيق

from sanic import Sanic
from sanic.response import text

app = Sanic("MyApp")

@app.get("/")
async def index(request):
    return text("مرحباً من Sanic")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

التوجيه ومعالجة الطلبات

المسارات الأساسية

@app.get("/")
async def get_handler(request):
    return text("طلب GET")

@app.post("/")
async def post_handler(request):
    return text("طلب POST")

@app.put("/")
async def put_handler(request):
    return text("طلب PUT")

@app.delete("/")
async def delete_handler(request):
    return text("طلب DELETE")

المسارات غير المتزامنة

import asyncio

@app.get("/async")
async def async_route(request):
    await asyncio.sleep(1)  # محاكاة عملية غير متزامنة
    return text("استجابة غير متزامنة")

العمل مع المعلمات والبيانات

معلمات المسار

@app.get("/user/<user_id:int>")
async def get_user(request, user_id):
    return text(f"معرف المستخدم: {user_id}")

@app.get("/profile/<username:str>")
async def get_profile(request, username):
    return text(f"الملف الشخصي: {username}")

معلمات الاستعلام

@app.get("/search")
async def search(request):
    query = request.args.get("q", "لا شيء")
    limit = request.args.get("limit", "10")
    return text(f"بحث: {query}, الحد: {limit}")

معالجة JSON والنماذج

from sanic.response import json

@app.post("/api/data")
async def receive_data(request):
    data = request.json
    return json({"received": data})

@app.post("/form")
async def handle_form(request):
    username = request.form.get("username")
    email = request.form.get("email")
    return json({"username": username, "email": email})

أنواع الاستجابات

تنسيقات استجابة مختلفة

from sanic.response import text, json, html, redirect, file

@app.get("/text")
async def text_response(request):
    return text("نص بسيط")

@app.get("/json")
async def json_response(request):
    return json({"message": "استجابة JSON"})

@app.get("/html")
async def html_response(request):
    return html("<h1>صفحة HTML</h1>")

توصيات