كتابة API في Python (مع Flask و RapidAPI)

كتابة API في Python (مع Flask و RapidAPI)

إذا كنت تقرأ هذا المقال ، فمن المحتمل أنك على دراية بالإمكانيات التي تنفتح عند استخدام API (واجهة برمجة التطبيقات).

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

الجواب بسيط: أنت بحاجة إنشاء API الخاصة بك.

في حين أن هذه قد تبدو مهمة شاقة في البداية ، إلا أنها في الواقع بسيطة للغاية. سنوضح لك كيفية القيام بذلك باستخدام بايثون.

ما تحتاجه للبدء

يتطلب تطوير API:

  • بايثون 3 ؛
  • قارورة - إطار عمل بسيط وسهل الاستخدام لإنشاء تطبيقات الويب ؛
  • راحة في القارورة هو امتداد لـ Flask يتيح لك تطوير واجهة برمجة تطبيقات REST بسرعة وبأقل قدر ممكن من التكوين.

يتم التثبيت بواسطة الأمر:

pip install flask-restful

نوصي ببرمجة مكثفة مجانية للمبتدئين:
تطوير Telegram bot في C # - 26-28 أغسطس. برنامج مكثف مجاني يسمح لك بفهم كيفية عمل الروبوتات المساعدة ، وميزات العمل مع Telegram API والفروق الدقيقة الأخرى. سيحصل المشاركون الثلاثة الأوائل على 30 روبل من Skillbox.

قبل ان تبدا

سنقوم بتطوير RESTful API باستخدام أساسي وظيفة CRUID.

لفهم المهمة تمامًا ، دعنا نفهم المصطلحين المذكورين أعلاه.

ما هو ريست؟

واجهة برمجة تطبيقات REST (نقل الحالة التمثيلية) هي واجهة برمجة تطبيقات تستخدم طلبات HTTP لتبادل البيانات.

يجب أن تفي واجهات برمجة تطبيقات REST بمعايير معينة:

  • بنية خادم العميل: يتفاعل العميل مع واجهة المستخدم ، ويتفاعل الخادم مع الواجهة الخلفية ومخزن البيانات. العميل والخادم مستقلان ، يمكن استبدال أي منهما بشكل منفصل عن الآخر.
  • بدون حالة - لا يتم تخزين بيانات العميل على الخادم. يتم تخزين حالة الجلسة على جانب العميل.
  • قابلية التخزين المؤقت - يمكن للعملاء تخزين استجابات الخادم مؤقتًا لتحسين الأداء العام.

ما هو الخام؟

الخام هو مفهوم برمجة يصف أربعة إجراءات أساسية (إنشاء وقراءة وتحديث وحذف).

في واجهة برمجة تطبيقات REST ، تكون أنواع الطلبات وطرق الطلب مسؤولة عن إجراءات مثل النشر ، والحصول ، والوضع ، والحذف.

الآن بعد أن تعاملنا مع المصطلحات الأساسية ، يمكننا البدء في إنشاء واجهة برمجة التطبيقات.

تطوير

دعونا ننشئ مستودعًا للاقتباسات حول الذكاء الاصطناعي. يعد الذكاء الاصطناعي أحد أسرع التقنيات نموًا اليوم ، و Python هي أداة شائعة للعمل مع الذكاء الاصطناعي.

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

لنبدأ باستيراد الوحدات المطلوبة وإعداد Flask:

from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)

في هذا المقتطف ، تعتبر Flask و Api و Resource الفئات التي نحتاجها.

Reqparse هي واجهة تحليل الطلبات Flask-RESTful ... ستحتاج أيضًا إلى وحدة عشوائية لعرض اقتباس عشوائي.

الآن سننشئ مستودعًا للاقتباسات حول الذكاء الاصطناعي.

سيحتوي كل إدخال ريبو على:

  • معرف رقمي
  • اسم مؤلف الاقتباس ؛
  • يقتبس.

نظرًا لأن هذا مجرد مثال تعليمي ، فسوف نقوم بتخزين جميع الإدخالات في قائمة Python. في تطبيق حقيقي ، من المرجح أن نستخدم قاعدة بيانات بدلاً من ذلك.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "The business plans of the next 10,000 startups are easy to forecast: " +
                 "Take X and add AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "The development of full artificial intelligence could " +
                 "spell the end of the human race… " +
                 "It would take off on its own, and re-design " +
                 "itself at an ever increasing rate. " +
                 "Humans, who are limited by slow biological evolution, " +
                 "couldn't compete, and would be superseded."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "I visualize a time when we will be to robots what " +
                 "dogs are to humans, " +
                 "and I’m rooting for the machines."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "The pace of progress in artificial intelligence " +
                 "(I’m not referring to narrow AI) " +
                 "is incredibly fast. Unless you have direct " +
                 "exposure to groups like Deepmind, " +
                 "you have no idea how fast — it is growing " +
                 "at a pace close to exponential. " +
                 "The risk of something seriously dangerous " +
                 "happening is in the five-year timeframe." +
                 "10 years at most."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "I have always been convinced that the only way " +
                 "to get artificial intelligence to work " +
                 "is to do the computation in a way similar to the human brain. " +
                 "That is the goal I have been pursuing. We are making progress, " +
                 "though we still have lots to learn about " +
                 "how the brain actually works."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "People worry that computers will " +
                 "get too smart and take over the world, " +
                 "but the real problem is that they're too stupid " +
                 "and they've already taken over the world."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "It seems probable that once the machine thinking " +
                 "method had started, it would not take long " +
                 "to outstrip our feeble powers… " +
                 "They would be able to converse " +
                 "with each other to sharpen their wits. " +
                 "At some stage therefore, we should " +
                 "have to expect the machines to take control."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Artificial intelligence will reach " +
                 "human levels by around 2029. " +
                 "Follow that out further to, say, 2045, " +
                 "we will have multiplied the intelligence, " +
                 "the human biological machine intelligence " +
                 "of our civilization a billion-fold."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nobody phrases it this way, but I think " +
                 "that artificial intelligence " +
                 "is almost a humanities discipline. It's really an attempt " +
                 "to understand human intelligence and human cognition."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "We're making this analogy that AI is the new electricity." +
                 "Electricity transformed industries: agriculture, " +
                 "transportation, communication, manufacturing."
    }
]

نحتاج الآن إلى إنشاء فئة مورد اقتباس تحدد عمليات نقاط نهاية API الخاصة بنا. يجب الإعلان عن أربع طرق داخل الفصل: get ، post ، put ، delete.

لنبدأ بطريقة GET

يتيح لك الحصول على عرض أسعار محدد عن طريق تحديد معرفه ، أو عرض أسعار عشوائي إذا لم يتم تحديد معرف.

class Quote(Resource):
    def get(self, id=0):
        if id == 0:
            return random.choice(ai_quotes), 200
        for quote in ai_quotes:
            if(quote["id"] == id):
                return quote, 200
        return "Quote not found", 404

تقوم طريقة GET بإرجاع عرض أسعار عشوائي إذا كان المعرف يحتوي على القيمة الافتراضية ، أي عند الاتصال لم يتم تعيين معرّف الطريقة.

إذا تم تعيينه ، فإن الطريقة تبحث بين علامات الاقتباس وتجد الشخص الذي يحتوي على المعرف المحدد. إذا لم يتم العثور على أي شيء ، فسيتم عرض الرسالة "Quote not found، 404" (عرض الأسعار غير موجود ، XNUMX).

تذكر أن الطريقة تعيد حالة HTTP تبلغ 200 إذا كان الطلب ناجحًا و 404 إذا لم يتم العثور على الإدخال.

لنقم الآن بإنشاء طريقة POST لإضافة عرض أسعار جديد إلى المستودع

سيحصل على معرف كل اقتباس جديد أثناء الكتابة. بالإضافة إلى ذلك ، سيستخدم POST reqparse لتحليل المعلمات التي ستدخل في نص الطلب (نص المؤلف والاقتباس).

def post(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              return f"Quote with id {id} already exists", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

في الكود أعلاه ، قبلت طريقة POST معرّف عرض الأسعار. ثم ، باستخدام reqparse ، قام باسترجاع المؤلف والاقتباس من الطلب ، وتخزينهما في قاموس المعلمات.

إذا كان هناك بالفعل عرض أسعار بالمعرف المحدد ، فستعرض الطريقة الرسالة المناسبة والرمز 400.

إذا لم يتم إنشاء عرض أسعار بالمعرف المحدد بعد ، فإن الطريقة تنشئ إدخالًا جديدًا بالمعرف والمؤلف المحددين ، بالإضافة إلى معلمات أخرى. ثم يضيف إدخالاً إلى قائمة ai_quotes ويعيد إدخالاً مع اقتباس جديد مع رمز 201.

نقوم الآن بإنشاء طريقة PUT لتغيير عرض أسعار موجود في المستودع

def put(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              quote["author"] = params["author"]
              quote["quote"] = params["quote"]
              return quote, 200
      
      quote = {
          "id": id,
          "author": params["author"],
          "quote": params["quote"]
      }
      
      ai_quotes.append(quote)
      return quote, 201

أسلوب PUT ، على غرار المثال السابق ، يأخذ معرفًا ومدخلًا ويوزع معاملات الاقتباس باستخدام reqparse.

في حالة وجود عرض أسعار بالمعرف المحدد ، ستقوم الطريقة بتحديثه بالمعلمات الجديدة ثم إخراج عرض الأسعار المحدث برمز 200. إذا لم يكن هناك عرض أسعار بالمعرف المحدد حتى الآن ، فسيتم إنشاء سجل جديد برمز 201.

أخيرًا ، دعنا ننشئ طريقة DELETE لإزالة عرض أسعار لم يعد ملهمًا.

def delete(self, id):
      global ai_quotes
      ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
      return f"Quote with id {id} is deleted.", 200

تأخذ هذه الطريقة معرف الاقتباس كمدخلات وتقوم بتحديث قائمة الاقتباسات باستخدام القائمة المشتركة.

الآن بعد أن أنشأنا جميع الطرق ، كل ما نحتاج إليه هو ببساطة إضافة المورد إلى واجهة برمجة التطبيقات ، وتعيين المسار ، وتشغيل Flask.

api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
    app.run(debug=True)

خدمة REST API جاهزة!

بعد ذلك ، يمكننا حفظ الكود في ملف app.py عن طريق تشغيله في وحدة التحكم باستخدام الأمر:

python3 app.py

إذا كان كل شيء على ما يرام ، فسنحصل على شيء مثل هذا:

* وضع التصحيح: تشغيل
* يعمل على 127.0.0.1: 5000 / (اضغط CTRL + C للإنهاء)
* إعادة التشغيل مع stat
* المصحح نشط!
* رقم التعريف الشخصي لبرنامج تصحيح الأخطاء: XXXXXXX

اختبار API

بعد إنشاء API ، يجب اختبارها.

يمكن القيام بذلك باستخدام الأداة المساعدة curl console أو Insomnia REST client ، أو عن طريق نشر API على Rapid API.

كتابة API في Python (مع Flask و RapidAPI)

نشر API الخاص بنا

RapidAPI هو أكبر سوق في العالم مع أكثر من 10 واجهة برمجة تطبيقات (وحوالي مليون مطور).

لا يوفر RapidAPI واجهة واحدة فقط للعمل مع واجهات برمجة تطبيقات تابعة لجهات خارجية ، ولكنه يتيح لك أيضًا نشر واجهة برمجة التطبيقات الخاصة بك بسرعة وسهولة.

إلى افعلها، تحتاج أولاً إلى نشره على خادم ما على الشبكة. في حالتنا ، سوف نستخدم Heroku. يجب ألا يسبب العمل معه أي صعوبات ، (يمكنك معرفة المزيد عنها هنا).

كيفية نشر API الخاص بك على Heroku

1. تثبيت Heroku.

تتمثل الخطوة الأولى في تسجيل وتثبيت واجهة سطر أوامر Heroku (CLI). يعمل هذا على Ubuntu 16+.

sudo المفاجئة تثبيت heroku -classic

ثم نقوم بتسجيل الدخول:

تسجيل الدخول heroku

2. أضف الملفات الضرورية.

نحتاج الآن إلى إضافة الملفات للنشر في مجلد في تطبيقنا:

  • Requirements.txt مع قائمة بوحدات Python النمطية المطلوبة ؛
  • Procfile ، الذي يحدد الأوامر التي يجب تنفيذها لتشغيل التطبيق ؛
  • .gitignore - لاستبعاد الملفات غير المطلوبة على الخادم.

سيحتوي ملف requirements.txt على الأسطر التالية:

  • قارورة
  • قارورة مريحة
  • غونيكورن

يرجى ملاحظة أننا أضفنا gunicorn (Python WSGI HTTP Server) إلى القائمة لأننا نحتاج إلى تشغيل تطبيقنا على الخادم.

سيحتوي Procfile على:

الويب: تطبيق gunicorn: app

محتوى .gitignore:

*.pyc
__pycache__/

الآن بعد أن تم إنشاء الملفات ، دعنا نهيئ git repo ونلتزم:

git init
git add
git commit -m "First API commit"

3. إنشاء تطبيق Heroku جديد.

heroku create

دفع الفرع الرئيسي إلى مستودع Heroku البعيد:

git push heroku master

يمكنك الآن البدء بفتح خدمة API بالأوامر:

heroku ps:scale web=1
heroku open
 

ستكون واجهة برمجة التطبيقات متاحة في your-random-heroku-name.herokuapp.com/ai-quotes.

كيفية إضافة Python API إلى سوق RapidAPI

بمجرد نشر خدمة API على Heroku ، يمكنك إضافتها إلى Rapid API. هنا وثائق مفصلة حول هذا الموضوع.

1. قم بإنشاء حساب RapidAPI.

كتابة API في Python (مع Flask و RapidAPI)

نقوم بتسجيل حساب مجاني - يمكن القيام بذلك باستخدام Facebook و Google و GitHub.

كتابة API في Python (مع Flask و RapidAPI)

2. إضافة API إلى لوحة التحكم.

كتابة API في Python (مع Flask و RapidAPI)

3. بعد ذلك ، أدخل معلومات عامة حول API الخاص بك.

كتابة API في Python (مع Flask و RapidAPI)

4. بعد النقر على "إضافة API" تظهر صفحة جديدة حيث يمكنك إدخال معلومات حول API الخاص بنا.

كتابة API في Python (مع Flask و RapidAPI)

5. يمكنك الآن إما إدخال نقاط نهاية API يدويًا أو تنزيلها ملف swagger باستخدام OpenAPI.

كتابة API في Python (مع Flask و RapidAPI)

حسنًا ، أنت الآن بحاجة إلى تعيين نقاط النهاية لواجهة برمجة التطبيقات الخاصة بنا على صفحة نقاط النهاية. في حالتنا ، تتوافق نقاط النهاية مع مفهوم CRUD (get ، post ، put ، delete).

كتابة API في Python (مع Flask و RapidAPI)

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

لإنشاء نقطة نهاية ، تحتاج إلى النقر فوق الزر "إنشاء نقطة نهاية".

كتابة API في Python (مع Flask و RapidAPI)

نكرر هذه العملية لجميع نقاط نهاية API الأخرى. هذا كل شئ! تهانينا ، لقد قمت بنشر API الخاص بك!

إذا سارت الأمور على ما يرام ، فستبدو صفحة واجهة برمجة التطبيقات كما يلي:

كتابة API في Python (مع Flask و RapidAPI)

اختتام

في هذه المقالة ، مررنا خلال عملية إنشاء خدمة RESTful API الخاصة بنا في Python ، جنبًا إلى جنب مع عملية نشر API على سحابة Heroku وإضافتها إلى دليل RapidAPI.

ولكن في الإصدار التجريبي ، تم عرض المبادئ الأساسية فقط لتطوير واجهة برمجة التطبيقات - لم يتم النظر في الفروق الدقيقة مثل الأمان والتسامح مع الأخطاء وقابلية التوسع.

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

المصدر: www.habr.com

إضافة تعليق