أفضل 5 أطر ويب غير متزامنة لـ Python

البرمجة غير المتزامنة هي مواطن من الدرجة الأولى في Python الآن. إذا كنت مطور ويب ، فهناك أطر عمل رائعة يمكنك الاختيار من بينها!

حتى كتابة هذه السطور ، لم يعد غير المتزامن مجرد كلمة طنانة في مجتمع Python. مع الافراج عن أسينسيو مكتبة في الإصدار 3.5 ، أقرت Python بتأثير Node.js على تطوير الويب وقدمت كلمتين رئيسيتين جديدتين في اللغة – غير متزامن وانتظر. كانت هذه مشكلة كبيرة جدًا لأن لغة Python حذرة للغاية من توسيع بناء الجملة الأساسي ما لم تكن هناك حاجة ملحة ، والتي تشير فقط إلى مدى الأهمية الأساسية التي أخذها مطورو Python في الاعتبار للقدرات غير المتزامنة.

نتيجة لذلك ، تم فتح بوابات البرمجة غير المتزامنة: بدأت المكتبات الجديدة والقديمة في الاستفادة من ميزة coroutines ، وانفجرت الأطر غير المتزامنة بشكل كبير ، وما زالت تُكتب اليوم. الأداء المتكافئ مع Node.js أو أفضل منه لم يسمع به من قبل ، وما لم تكن أنماط التحميل الخاصة بك تتضمن الكثير من المهام الثقيلة لوحدة المعالجة المركزية ، فلا يوجد سبب يمنعك من تقديم بضعة آلاف من الطلبات في الثانية.

لكن ما يكفي من الدافع!

دعنا نتفحص المشهد الحالي لبايثون ونتحقق من بعض أفضل الأطر غير المتزامنة.

إعصار

بشكل مفاجئ ، إعصار ليس إطارًا جديدًا على الإطلاق. تم إطلاقه الأولي في عام 2009 (قبل عشر سنوات بالضبط ، حتى كتابة هذا التقرير) ومنذ ذلك الحين ، كان تركيزه على توفير برمجة غير متزامنة صلبة مع التزامن العالي.

Tornado ليس إطار عمل ويب بشكل أساسي. إنها مجموعة من الوحدات غير المتزامنة ، والتي تُستخدم أيضًا لبناء وحدة إطار عمل الويب. بشكل أكثر تحديدًا ، هذه الوحدات هي:

  • Coroutines والأوليات الأخرى (tornado.gen ، tornado.locks ، tornado.queues ، إلخ.)
  • وحدات الشبكات (tornado.ioloop ، tornado.iostream ، إلخ.)
  • الخوادم والعملاء غير المتزامنين (tornado.httpserver ، tornado.httpclient ، إلخ)

تم دمجها لإنتاج وحدات الإطار النهائية: tornado.web ، tornado.routing ، tornado.template ، إلخ.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

تتمتع Tornado بمتابعة قوية وملتزمة في مجتمع Python وتستخدم من قبل المهندسين المعماريين ذوي الخبرة لبناء أنظمة عالية القدرة. إنه إطار عمل لديه منذ فترة طويلة إجابة لمشاكل التزامن ولكن ربما لم يصبح سائدًا لأنه لا يدعم معيار WSGI وكان كثيرًا من الشراء (تذكر أن الجزء الأكبر من مكتبات Python لا يزال متزامنًا ).

  كيفية تثبيت صورة في الجزء العلوي من سطح المكتب الخاص بك

سانيك

سانيك هو إطار عمل “حديث” بالمعنى الحقيقي للكلمة: فهو لا يدعم إصدار Python الأقل من 3.6 ، ويدعم بناء الجملة البسيط والعالمي غير المتزامن / انتظار من خارج الصندوق ، ونتيجة لذلك ، لا يجعلك تقرأ الأحمال من التوثيق والاحتفاظ بحالات الحافة في ذهنك قبل أن تتمكن من كتابة أول معالج HTTP.

نتيجة لذلك ، فإن النحو الناتج لطيف للغاية (في رأيي ، على الأقل) ؛ إنه يشبه الكود الذي تكتبه مع أي إطار مصغر آخر (Flask ، CherryPy ، على سبيل المثال) مع القليل من المتزامن المرشوشة في:

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

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

يمكن القول إن سانيك هو الإطار غير المتزامن الأكثر شعبية والأكثر شعبية في عالم بايثون. يحتوي على جميع الميزات التي تريدها تقريبًا لمشاريعك – التوجيه ، والبرمجيات الوسيطة ، وملفات تعريف الارتباط ، وإصدار الإصدارات ، والمخططات ، والعروض المستندة إلى الفصل ، والملفات الثابتة ، والتدفق ، والمآخذ ، وما إلى ذلك – وما لا يقدمه خارج الصندوق – القوالب ، ودعم قاعدة البيانات ، وملف الإدخال / الإخراج ، وقوائم الانتظار – يمكن إضافتها نظرًا لوجود مكتبات غير متزامنة كافية لهذه اعتبارًا من اليوم.

فيبورا

فيبورا هو ابن عم مقرب لـ Sanic ، إلا أنه يركز على أن يصبح أسرع خادم ويب Python موجود. في الواقع ، تستقبلك الزيارة الأولى لموقعها الإلكتروني بمقارنة إطار العمل:

كما ترى ، تدعي Vibora أنها أسرع بعدة مرات من الأطر الكلاسيكية وأنها أسرع بمرتين من Sanic ، أقرب منافس لها. بالطبع ، يجب أن تؤخذ المعايير بحذر. 🙂

على الرغم من أنه من حيث التركيب والميزات ، فإن Vibora يمكن مقارنتها بـ Sanic (أو ربما أفضل قليلاً لأنها تجمع المكتبات الشائعة وأشياء مثل القوالب متوفرة خارج الصندوق) ، إلا أنني أعتبر أن Sanic أكثر نضجًا لأنها كانت موجودة لفترة أطول ولديها مجتمع أكبر.

from vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def home():
    return JsonResponse({'hello': 'world'})

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

إذا كنت مدمنًا على الأداء ، فقد تطفو Vibora على قاربك. ومع ذلك ، اعتبارًا من كتابة هذا التقرير ، فإن Vibora تخضع لإعادة كتابة كاملة لتصبح أسرع ، و حلقة الوصل يشير إلى إصدار الأداء الخاص به أنه قيد “التطوير المكثف”. سيكون ذلك بمثابة خيبة أمل لأولئك الذين اختاروا Vibora في وقت سابق وسيواجهون قريبًا تغييرات سريعة ، ولكن مهلا ، إنها الأيام الأولى في عالم Python غير المتزامن ، ولا يتوقع أحد أن تكون الأمور مستقرة.

  كيف تغلق جهاز Mac الخاص بك باستخدام Terminal

ربع

إذا كنت تستمتع بالتطوير في Flask ولكنك تندم على عدم وجود دعم غير متزامن ، فستستمتع ربع كثيراً.

Quart متوافق مع ASGI قياسي ، وهو خليفة لمعيار WSGI الشهير ويقدم دعمًا غير متزامن. الشيء المثير للاهتمام في Quart هو أنه لا يشبه Flask فقط ولكنه متوافق بالفعل مع Flask API! أراد مؤلف هذا الإطار الحفاظ على إحساس Flask وإضافة دعم غير متزامن و WebSockets و HTTP 2 إليه. نتيجة لذلك ، يمكنك تعلم Quart مباشرة من توثيق Flask ، فقط مع الأخذ في الاعتبار أن الوظائف في Quart غير متزامنة.

from quart import Quart

app = Quart(__name__)

@app.route('/')
async def hello():
    return 'hello'

app.run()

يشعر (تقريبًا) تمامًا مثل Flask ، أليس كذلك؟!

نظرًا لأن Quart هو تطور لـ Flask ، فإن جميع الميزات الموجودة داخل Flask متوفرة: التوجيه ، والبرمجيات الوسيطة ، والجلسات ، والقوالب ، والمخططات ، وما إلى ذلك. في الواقع ، يمكنك حتى استخدام ملحقات Flask مباشرة داخل Quart. تتمثل إحدى الميزات في أن Python 3.7+ مدعوم فقط ، ولكن إذا لم تكن تشغل أحدث إصدار من Python ، فربما لا يكون عدم التزامن هو المسار الصحيح. 🙂

إن التوثيق مطلوب حقًا إذا لم تكن لديك خبرة سابقة مع Flask ، لكن يمكنني أن أوصي بـ Quart لأنه ربما يكون إطار العمل غير المتزامن الوحيد الذي يقترب من إصدار 1.0 قريبًا.

FastAPI

الإطار الأخير (ولكن الأكثر إثارة للإعجاب) في هذه القائمة هو FastAPI. لا ، إنه ليس إطار عمل خاص بواجهة برمجة التطبيقات فقط ؛ في الواقع ، يبدو أن FastAPI هو إطار العمل الأكثر ثراءً بالمزايا والأكثر ثراءً بالوثائق الذي صادفته عند البحث عن أطر عمل Python غير المتزامنة.

من المثير للاهتمام ملاحظة أن مؤلف الإطار درس العديد من الأطر الأخرى بشكل متعمق ، من الأطر المعاصرة مثل Django إلى الأطر الحديثة مثل Sanic ، بالإضافة إلى البحث عبر التقنيات في NestJS (وهو Node.js ، إطار عمل الويب Typescript). يمكن قراءة فلسفتهم التنموية والمقارنات الشاملة هنا.

بناء الجملة لطيف للغاية. يمكن للمرء أن يجادل أنه أكثر إمتاعًا من الأطر الأخرى التي صادفناها:

rom fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

والآن ، قائمة الميزات القاتلة التي تجعل FastAPI يتفوق على الأطر الأخرى:

إنشاء مستند API تلقائيًا: بمجرد كتابة نقاط النهاية الخاصة بك ، يمكنك اللعب بواجهة برمجة التطبيقات باستخدام واجهة مستخدم متوافقة مع المعايير. يتم دعم SwaggerUI و ReDoc وغيرها.

  كيفية عرض سجل المكالمات الهاتفية على Google

يقوم إطار العمل أيضًا بتوثيق نموذج البيانات التلقائي باستخدام مخطط JSON.

التطور الحديث: نعم ، يتم طرح كلمة “حديث” كثيرًا ، لكنني وجدت FastAPI في الواقع يتماشى مع حديثه. إن حقن التبعية والتلميح بالنوع هما مواطنان من الدرجة الأولى ، ولا يفرضان مبادئ الترميز الجيدة فحسب ، بل يمنعان الأخطاء والارتباك على المدى الطويل.

وثائق مستفيضة: لا أعرف عنك ، لكنني مصاصة تمامًا للتوثيق الجيد. وفي هذا المجال ، يفوز FastAPI. يحتوي على صفحات على صفحات من المستندات تشرح كل التفاصيل الدقيقة تقريبًا و “احترس!” لحظات للمطورين من جميع المستويات. أشعر بـ “قلب وروح” واضحين في المستندات هنا ، والمقارنة الوحيدة التي يمكنني العثور عليها هي مستندات Django (نعم ، مستندات FastAPI جيدة جدًا!).

ما وراء الأساسيات: يتمتع FastAPI بدعم WebSockets والدفق بالإضافة إلى GraphQL ، بالإضافة إلى وجود جميع المساعدين التقليديين مثل CORS والجلسات وملفات تعريف الارتباط وما إلى ذلك.

وماذا عن الأداء؟ حسنًا ، FastAPI مبني على مكتبة Starlette المذهلة ، مما أدى إلى أداء يتوافق مع Node ، وفي بعض الحالات ، حتى Go! بشكل عام ، لدي شعور حقًا بأن FastAPI سوف يتقدم كأفضل إطار عمل غير متزامن لبايثون.

استنتاج

يحدث الكثير في مشهد بايثون غير المتزامن هذه الأيام. تظهر أطر جديدة ، وتُعاد كتابة الأطر القديمة ، ويتم تطوير المكتبات لمطابقة السلوك غير المتزامن. على الرغم من أن Python لديها دعم مدمج لحلقة حدث ومن الممكن جعل أجزاء من التطبيق الخاص بك غير متزامنة ، يمكنك اختيار كل شيء والبناء على أحد الأطر هنا. فقط تأكد من مراعاة المدى الطويل: العديد من أطر عمل Python غير المتزامنة موجودة في مراحل مبكرة ويتم تطويرها بسرعة ، مما سيضر بعملية التطوير ويرفع تكاليف العمل. الحذر هو المفتاح!

لكن كل ما قيل وفعل ؛ Python جاهزة للإنتاج لتقديم أداء خفيف عندما يتعلق الأمر بأطر عمل الويب. إذا كنت تفكر لفترة طويلة في الهجرة إلى Node ، فلا داعي الآن لذلك! 🙂

يبدو جيدا؟ سيد بايثون اليوم!