نوشتن یک API در پایتون (با Flask و RapidAPI)

نوشتن یک API در پایتون (با Flask و RapidAPI)

اگر در حال خواندن این مقاله هستید، احتمالاً از قبل با امکاناتی که با استفاده از یک API (رابط برنامه نویسی برنامه) ارائه می شود آشنا هستید.

با افزودن یکی از بسیاری از API های باز به برنامه خود، می توانید عملکرد برنامه را گسترش دهید یا آن را با داده های لازم غنی کنید. اما اگر یک ویژگی منحصر به فرد ایجاد کنید که بخواهید با جامعه به اشتراک بگذارید چه؟

پاسخ ساده است: شما نیاز دارید API خود را ایجاد کنید.

اگرچه ممکن است در ابتدا این کار دشواری به نظر برسد، اما در واقع ساده است. ما به شما نشان خواهیم داد که چگونه با استفاده از پایتون این کار را انجام دهید.

آنچه برای شروع نیاز دارید

برای توسعه یک API شما نیاز دارید:

  • پایتون 3;
  • فلاسک - یک چارچوب ساده و کاربردی برای ایجاد برنامه های کاربردی وب؛
  • Flask-RESTful یک افزونه برای Flask است که به شما امکان می دهد یک REST API را به سرعت و با حداقل پیکربندی توسعه دهید.

نصب با دستور زیر انجام می شود:

pip install flask-restful

ما یک دوره برنامه نویسی فشرده رایگان را برای مبتدیان توصیه می کنیم:
توسعه ربات تلگرام در سی شارپ - 26 تا 28 اوت. یک دوره فشرده رایگان که به شما امکان می دهد نحوه کار ربات های دستیار، ویژگی های کار با API تلگرام و سایر نکات ظریف را درک کنید. سه شرکت کننده برتر 30 روبل از Skillbox دریافت خواهند کرد.

قبل از اینکه تو شروع کنی

ما قصد داریم یک API RESTful با پایه توسعه دهیم عملکرد CRUID.

برای درک کامل کار، بیایید دو اصطلاح ذکر شده در بالا را درک کنیم.

REST چیست؟

REST API (Representational State Transfer) یک API است که از درخواست های HTTP برای تبادل داده ها استفاده می کند.

API های REST باید معیارهای خاصی را داشته باشند:

  • معماری سرویس گیرنده-سرور: کلاینت با رابط کاربری تعامل دارد و سرور با باطن و ذخیره سازی داده ها تعامل دارد. کلاینت و سرور مستقل هستند، هر یک از آنها را می توان به طور جداگانه از دیگری جایگزین کرد.
  • بدون وضعیت - هیچ داده مشتری روی سرور ذخیره نمی شود. وضعیت جلسه در سمت مشتری ذخیره می شود.
  • قابلیت ذخیره سازی در حافظه پنهان - مشتریان می توانند پاسخ های سرور را برای بهبود عملکرد کلی ذخیره کنند.

CRUD چیست؟

چیز چندش و کثیف یک مفهوم برنامه نویسی است که چهار عمل اساسی (ایجاد، خواندن، به روز رسانی و حذف) را توصیف می کند.

در REST API، انواع درخواست و روش‌های درخواست مسئولیت اعمالی مانند ارسال، دریافت، گذاشتن، حذف را بر عهده دارند.

اکنون که اصطلاحات اساسی را فهمیدیم، می توانیم شروع به ایجاد API کنیم.

توسعه

بیایید یک مخزن از نقل قول ها در مورد هوش مصنوعی ایجاد کنیم. هوش مصنوعی امروزه یکی از سریع‌ترین فناوری‌های در حال رشد است و پایتون ابزاری محبوب برای کار با هوش مصنوعی است.

با استفاده از این API، یک توسعه دهنده پایتون می تواند به سرعت اطلاعاتی در مورد هوش مصنوعی به دست آورد و از پیشرفت های جدید الهام بگیرد. اگر یک توسعه دهنده افکار ارزشمندی در مورد این موضوع داشته باشد، می تواند آنها را به مخزن اضافه کند.

بیایید با وارد کردن ماژول های لازم و راه اندازی 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 است... همچنین برای نمایش یک نقل قول تصادفی به یک ماژول تصادفی نیاز دارید.

اکنون یک مخزن از نقل قول ها در مورد هوش مصنوعی ایجاد خواهیم کرد.

هر ورودی مخزن شامل موارد زیر خواهد بود:

  • شناسه دیجیتال؛
  • نام نویسنده نقل قول؛
  • نقل قول

از آنجایی که این فقط یک مثال آموزشی است، ما تمام ورودی ها را در یک لیست پایتون ذخیره می کنیم. در یک برنامه واقعی، ما احتمالاً به جای آن از یک پایگاه داده استفاده می کنیم.

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."
    }
]

اکنون باید یک کلاس منبع Quote ایجاد کنیم که عملیات نقاط انتهایی 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

اگر ID حاوی مقدار پیش‌فرض باشد، متد GET یک نقل قول تصادفی برمی‌گرداند. هیچ شناسه ای در هنگام فراخوانی متد مشخص نشده است.

اگر مشخص شده باشد، متد در بین نقل قول ها جستجو می کند و موردی را که حاوی شناسه مشخص شده است می یابد. اگر چیزی پیدا نشد، پیغام " نقل قول یافت نشد، 404" نمایش داده می شود.

به یاد داشته باشید: اگر درخواست موفقیت آمیز بود، این روش وضعیت 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، نویسنده و نقل قول را از پرس و جو بازیابی کرد و آنها را در فرهنگ لغت params ذخیره کرد.

اگر یک نقل قول با شناسه مشخص شده از قبل وجود داشته باشد، روش یک پیام و کد 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، مشابه مثال قبلی، ID و ورودی را می گیرد و پارامترهای نقل قول را با استفاده از 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

این روش شناسه نقل قول را به عنوان ورودی دریافت می کند و لیست ai_quotes را با استفاده از لیست مشترک به روز می کند.

اکنون که همه متدها را ایجاد کرده ایم، تنها کاری که باید انجام دهیم این است که به سادگی یک منبع به API اضافه کنیم، مسیر را تعیین کنیم و 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
* Debugger فعال است!
* پین دیباگر: XXXXXXX

تست API

هنگامی که API ایجاد شد، باید آزمایش شود.

این را می توان با استفاده از ابزار curl console یا سرویس گیرنده Insomnia REST یا با انتشار API در Rapid API انجام داد.

نوشتن یک API در پایتون (با Flask و RapidAPI)

انتشار API ما

RapidAPI با بیش از 10 API (و حدود 000 میلیون توسعه دهنده) بزرگترین بازار جهان است.

RapidAPI نه تنها یک رابط واحد برای کار با API های شخص ثالث ارائه می دهد، بلکه به شما این امکان را می دهد که سریع و آسان API خود را منتشر کنید.

به انجام دهید، ابتدا باید آن را در برخی از سرورهای شبکه منتشر کنید. در مورد ما استفاده خواهیم کرد هروکو. کار با آن نباید هیچ مشکلی ایجاد کند، (در اینجا می توانید اطلاعات بیشتری در مورد او پیدا کنید).

چگونه API خود را در Heroku منتشر کنیم

1. Heroku را نصب کنید.

اولین قدم ثبت و نصب رابط خط فرمان Heroku (CLI) است. این در اوبونتو 16+ کار می کند.

sudo snap install heroku —classic

سپس وارد شوید:

ورود به سیستم heroku

2. فایل های لازم را اضافه کنید.

اکنون باید فایل هایی را که قرار است منتشر شوند به پوشه ای در برنامه خود اضافه کنیم:

  • الزامات.txt با لیستی از ماژول های پایتون مورد نیاز.
  • Profile، که مشخص می کند چه دستوراتی باید برای اجرای برنامه اجرا شوند.
  • .gitignore - برای حذف فایل هایی که در سرور مورد نیاز نیستند.

فایل requires.txt شامل خطوط زیر خواهد بود:

  • فلاسک
  • فلاسک آرام
  • اسب شاخدار

لطفاً توجه داشته باشید که ما gunicorn (سرور Python WSGI HTTP) را به لیست اضافه کرده ایم زیرا باید برنامه خود را روی سرور اجرا کنیم.

نمایه شامل موارد زیر خواهد بود:

وب: برنامه Gunicorn: برنامه

محتویات .gitignore:

*.pyc
__pycache__/

حالا که فایل‌ها ساخته شدند، بیایید git repo را مقداردهی اولیه کرده و commit کنیم:

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
 

API در دسترس خواهد بود your-random-heroku-name.herokuapp.com/ai-quotes.

چگونه API پایتون خود را به بازار RapidAPI اضافه کنید

هنگامی که سرویس API شما در Heroku منتشر شد، می توانید آن را به Rapid API اضافه کنید. اینجا مستندات دقیق در این مورد.

1. یک حساب RapidAPI ایجاد کنید.

نوشتن یک API در پایتون (با Flask و RapidAPI)

یک حساب کاربری رایگان ثبت کنید - این کار را می توان با استفاده از Facebook، Google، GitHub انجام داد.

نوشتن یک API در پایتون (با Flask و RapidAPI)

2. API را به کنترل پنل اضافه کنید.

نوشتن یک API در پایتون (با Flask و RapidAPI)

3. در مرحله بعد، اطلاعات کلی در مورد API خود را وارد کنید.

نوشتن یک API در پایتون (با Flask و RapidAPI)

4. پس از کلیک بر روی "افزودن API" صفحه جدیدی ظاهر می شود که در آن می توانید اطلاعات مربوط به API ما را وارد کنید.

نوشتن یک API در پایتون (با Flask و RapidAPI)

5. اکنون می توانید به صورت دستی نقاط پایانی API را وارد کنید یا دانلود کنید فاحشه-پرونده با استفاده از OpenAPI

نوشتن یک API در پایتون (با Flask و RapidAPI)

خوب، اکنون باید نقاط انتهایی API خود را در صفحه Endpoints تنظیم کنیم. در مورد ما، نقاط پایانی با مفهوم CRUD (دریافت، ارسال، گذاشتن، حذف) مطابقت دارد.

نوشتن یک API در پایتون (با Flask و RapidAPI)

در مرحله بعد، باید یک نقطه پایانی GET AI Quote ایجاد کنید که یک نقل قول تصادفی (در صورت پیش‌فرض بودن شناسه) یا یک نقل قول برای شناسه مشخص شده را نمایش دهد.

برای ایجاد نقطه پایانی، روی دکمه «ایجاد نقطه پایانی» کلیک کنید.

نوشتن یک API در پایتون (با Flask و RapidAPI)

ما این فرآیند را برای سایر نقاط پایانی API تکرار می کنیم. همین! تبریک می گویم، شما API خود را منتشر کرده اید!

اگر همه چیز خوب باشد، صفحه API چیزی شبیه به این خواهد بود:

نوشتن یک API در پایتون (با Flask و RapidAPI)

نتیجه

در این مقاله، فرآیند ایجاد سرویس RESTful API خود را در پایتون به همراه فرآیند انتشار API در ابر Heroku و افزودن آن به دایرکتوری RapidAPI را یاد گرفتیم.

اما نسخه آزمایشی فقط اصول اولیه توسعه API را نشان داد - تفاوت های ظریف مانند امنیت، تحمل خطا و مقیاس پذیری در نظر گرفته نشد.

هنگام توسعه یک API واقعی، همه اینها باید در نظر گرفته شوند.

منبع: www.habr.com

اضافه کردن نظر