مقدمة عن 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>")