Python-da API yozish (Flask va RapidAPI bilan)

Python-da API yozish (Flask va RapidAPI bilan)

Agar siz ushbu maqolani o'qiyotgan bo'lsangiz, ehtimol siz API (Application Programming Interface) dan foydalanishda ochiladigan imkoniyatlar bilan tanish bo'lsangiz kerak.

Ilovangizga ko'plab umumiy APIlardan birini qo'shish orqali siz ushbu ilovaning funksionalligini kengaytirishingiz yoki uni kerakli ma'lumotlar bilan to'ldirishingiz mumkin. Agar siz hamjamiyat bilan baham ko'rmoqchi bo'lgan noyob xususiyatni ishlab chiqqan bo'lsangiz-chi?

Javob oddiy: sizga kerak o'z API yarating.

Avvaliga bu juda qiyin vazifadek tuyulsa-da, aslida bu juda oddiy. Buni Python bilan qanday qilishni sizga ko'rsatamiz.

Boshlash uchun nima kerak

API ishlab chiqish quyidagilarni talab qiladi:

  • Python3;
  • chirog'i — veb-ilovalarni yaratish uchun oddiy va ishlatish uchun qulay ramka;
  • Flask - REST Flask uchun kengaytma bo‘lib, u sizga REST API ni tez va minimal sozlash bilan ishlab chiqish imkonini beradi.

O'rnatish quyidagi buyruq bilan amalga oshiriladi:

pip install flask-restful

Yangi boshlanuvchilar uchun bepul intensiv dasturlashni tavsiya qilamiz:
C# da Telegram botini ishlab chiqish - 26-28 avgust. Yordamchi botlar qanday ishlashini, Telegram API bilan ishlash xususiyatlarini va boshqa nuanslarni tushunish imkonini beruvchi bepul intensiv. Eng yaxshi uch ishtirokchi Skillbox’dan 30 000 rubl oladi.

Boshlashdan oldin

Biz asosiy bilan RESTful API ishlab chiqmoqchimiz CRUID funksiyasi.

Vazifani to'liq tushunish uchun yuqorida aytib o'tilgan ikkita atamani tushunaylik.

REST nima?

REST API (vakillik holatini uzatish) - bu ma'lumotlarni almashish uchun HTTP so'rovlaridan foydalanadigan API.

REST API ma'lum mezonlarga javob berishi kerak:

  • Mijoz-server arxitekturasi: mijoz foydalanuvchi interfeysi bilan, server esa backend va ma'lumotlar ombori bilan o'zaro ta'sir qiladi. Mijoz va server mustaqildir, ularning har biri boshqasidan alohida almashtirilishi mumkin.
  • Fuqaroligi yo'q - serverda mijoz ma'lumotlari saqlanmaydi. Seans holati mijoz tomonida saqlanadi.
  • Keshlash imkoniyati - Mijozlar umumiy ish faoliyatini yaxshilash uchun server javoblarini keshlashi mumkin.

CRUD nima?

RAW to'rtta asosiy harakatni (yaratish, o'qish, yangilash va o'chirish) tavsiflovchi dasturlash tushunchasi.

REST API-da so'rov turlari va so'rov usullari post, olish, qo'yish, o'chirish kabi harakatlar uchun javobgardir.

Endi biz asosiy shartlarni ko'rib chiqdik, biz API yaratishni boshlashimiz mumkin.

Rivojlanish

Keling, sun'iy intellekt haqidagi iqtiboslar omborini yarataylik. AI bugungi kunda eng tez rivojlanayotgan texnologiyalardan biridir va Python AI bilan ishlash uchun mashhur vositadir.

Ushbu API yordamida Python dasturchisi AI haqida tezda bilib olishi va yangi yutuqlardan ilhomlanishi mumkin. Agar ishlab chiquvchining ushbu mavzu bo'yicha qimmatli fikrlari bo'lsa, u ularni omborga qo'shishi mumkin.

Kerakli modullarni import qilish va Flaskni sozlashdan boshlaylik:

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

Ushbu parchada Flask, Api va Resource bizga kerak bo'lgan sinflardir.

Reqparse - Flask-RESTful so'rovini tahlil qilish interfeysi... Tasodifiy taklifni ko'rsatish uchun tasodifiy modul ham kerak bo'ladi.

Endi biz AI haqidagi tirnoqlar omborini yaratamiz.

Har bir repo yozuvi quyidagilarni o'z ichiga oladi:

  • raqamli identifikator;
  • iqtibos muallifining ismi;
  • iqtibos.

Bu shunchaki o'rganish misoli bo'lgani uchun biz barcha yozuvlarni Python ro'yxatida saqlaymiz. Haqiqiy dasturda biz uning o'rniga ma'lumotlar bazasidan foydalanamiz.

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

Endi biz API so'nggi nuqtalarimiz operatsiyalarini aniqlaydigan Quote resurs sinfini yaratishimiz kerak. Sinf ichida to'rtta usul e'lon qilinishi kerak: olish, joylashtirish, qo'yish, o'chirish.

Keling, GET usulidan boshlaylik

Bu sizga uning identifikatorini ko'rsatish orqali ma'lum bir kotirovkani yoki ID ko'rsatilmagan bo'lsa, tasodifiy taklifni olish imkonini beradi.

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 usuli, agar ID standart qiymatni o'z ichiga olgan bo'lsa, tasodifiy tirnoqni qaytaradi, ya'ni. Usulni chaqirganda ID o'rnatilmagan.

Agar u o'rnatilgan bo'lsa, usul qo'shtirnoqlar orasidan qidiradi va berilgan identifikatorni o'z ichiga olganini topadi. Hech narsa topilmasa, "Iqtibos topilmadi, 404" xabari ko'rsatiladi.

Esda tuting, agar so'rov muvaffaqiyatli bo'lsa, usul HTTP holatini 200 va agar yozuv topilmasa 404 ni qaytaradi.

Endi omborga yangi taklif qo'shish uchun POST usulini yarataylik

Siz kiritganingizda u har bir yangi taklifning identifikatorini oladi. Bundan tashqari, POST so'rovning asosiy qismiga tushadigan parametrlarni (muallif va iqtibos matni) tahlil qilish uchun reqparse dan foydalanadi.

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

Yuqoridagi kodda POST usuli tirnoq identifikatorini qabul qildi. Keyin, reqparse dan foydalanib, u so'rovdan muallif va iqtiboslarni olib, ularni params lug'atiga saqladi.

Agar ko'rsatilgan identifikatorga ega taklif allaqachon mavjud bo'lsa, usul tegishli xabarni va 400 kodini ko'rsatadi.

Agar ko'rsatilgan identifikatorga ega taklif hali yaratilmagan bo'lsa, usul ko'rsatilgan identifikator va muallif, shuningdek, boshqa parametrlar bilan yangi yozuv yaratadi. Keyin u ai_quotes ro'yxatiga yozuv qo'shadi va 201 kodi bilan birga yangi tirnoq bilan yozuvni qaytaradi.

Endi biz ombordagi mavjud taklifni o'zgartirish uchun PUT usulini yaratamiz

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

Oldingi misolga o'xshash PUT usuli ID va kiritishni oladi va reqparse yordamida kotirovka parametrlarini tahlil qiladi.

Agar ko'rsatilgan identifikatorga ega bo'lgan taklif mavjud bo'lsa, usul uni yangi parametrlar bilan yangilaydi va keyin 200 kodi bilan yangilangan kotirovkani chiqaradi. Agar ko'rsatilgan identifikator bilan kotirovka hali mavjud bo'lmasa, 201 kodi bilan yangi yozuv yaratiladi.

Va nihoyat, endi ilhomlantirmaydigan iqtibosni olib tashlash uchun DELETE usulini yarataylik.

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

Ushbu usul kotirovka identifikatorini kiritish sifatida qabul qiladi va umumiy ro'yxat yordamida ai_quotes ro'yxatini yangilaydi.

Endi biz barcha usullarni yaratganimizdan so‘ng, faqat API ga manba qo‘shish, yo‘lni belgilash va Flaskni ishga tushirish kifoya.

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

REST API xizmatimiz tayyor!

Keyinchalik, kodni konsolda buyruq bilan ishga tushirish orqali app.py fayliga saqlashimiz mumkin:

python3 app.py

Agar hamma narsa yaxshi bo'lsa, biz shunga o'xshash narsani olamiz:

* Nosozliklarni tuzatish rejimi: yoqilgan
* Ishlamoqda 127.0.0.1:5000/ (Chiqish uchun CTRL+C tugmalarini bosing)
* Stat bilan qayta ishga tushirish
* Nosozliklarni tuzatuvchi faol!
* Nosozliklarni tuzatuvchi PIN: XXXXXXX

API sinovdan o'tkazilmoqda

API yaratilgandan so'ng uni sinab ko'rish kerak.

Buni curl konsoli yordam dasturi yoki Insomnia REST mijozi yoki API-ni Rapid API-da nashr qilish orqali amalga oshirish mumkin.

Python-da API yozish (Flask va RapidAPI bilan)

Bizning API nashr etilmoqda

RapidAPI 10 000 dan ortiq API (va 1 millionga yaqin dasturchilar) bilan dunyodagi eng yirik bozordir.

RapidAPI nafaqat uchinchi tomon API-lari bilan ishlash uchun yagona interfeysni taqdim etadi, balki o'z API-ni tez va oson nashr qilish imkonini beradi.

Uchun buni amalga oshirish uchun, avval uni tarmoqdagi ba'zi serverlarga nashr qilishingiz kerak. Bizning holatlarimizda biz foydalanamiz Heroku. U bilan ishlash hech qanday qiyinchilik tug'dirmasligi kerak, (u haqida ko'proq ma'lumotni bu yerda topishingiz mumkin).

API-ni Heroku-da qanday nashr qilish kerak

1. Heroku-ni o'rnating.

Birinchi qadam Heroku buyruq qatori interfeysini (CLI) ro'yxatdan o'tkazish va o'rnatishdir. Bu Ubuntu 16+ da ishlaydi.

sudo snap install heroku --classic

Keyin tizimga kiramiz:

Heroku login

2. Kerakli fayllarni qo'shing.

Endi biz ilovamizdagi papkaga nashr qilish uchun fayllarni qo'shishimiz kerak:

  • talab qilinadigan Python modullari ro'yxati bilan talablar.txt;
  • Procfile, bu dasturni ishga tushirish uchun qaysi buyruqlar bajarilishi kerakligini belgilaydi;
  • .gitignore - serverda kerak bo'lmagan fayllarni chiqarib tashlash uchun.

talablar.txt fayli quyidagi qatorlarni o'z ichiga oladi:

  • shisha
  • kolba tinch
  • gunicorn

Iltimos, biz ro'yxatga gunicorn (Python WSGI HTTP Server) qo'shdik, chunki biz ilovamizni serverda ishga tushirishimiz kerak.

Profil fayli quyidagilarni o'z ichiga oladi:

veb: gunicorn ilovasi: ilova

.gitignore tarkibi:

*.pyc
__pycache__/

Endi fayllar yaratilgandan so'ng, keling, git repo-ni ishga tushiramiz va bajaramiz:

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

3. Yangi Heroku ilovasini yarating.

heroku create

Asosiy filialni masofaviy Heroku repoga surish:

git push heroku master

Endi siz API xizmatini buyruqlar bilan ochishingiz mumkin:

heroku ps:scale web=1
heroku open
 

API quyidagi manzilda mavjud bo'ladi your-random-heroku-name.herokuapp.com/ai-quotes.

Python API-ni RapidAPI bozoriga qanday qo'shish mumkin

API xizmati Heroku-da nashr etilgandan so'ng, uni Rapid API-ga qo'shishingiz mumkin. Bu yerga batafsil hujjatlar ushbu mavzu bo'yicha.

1. RapidAPI hisobini yarating.

Python-da API yozish (Flask va RapidAPI bilan)

Biz bepul hisob qaydnomasini ro'yxatdan o'tkazamiz - bu Facebook, Google, GitHub yordamida amalga oshirilishi mumkin.

Python-da API yozish (Flask va RapidAPI bilan)

2. Boshqaruv paneliga API qo'shing.

Python-da API yozish (Flask va RapidAPI bilan)

3. Keyin API haqida umumiy ma'lumotlarni kiriting.

Python-da API yozish (Flask va RapidAPI bilan)

4. "API qo'shish" tugmasini bosgandan so'ng API haqida ma'lumot kiritishingiz mumkin bo'lgan yangi sahifa paydo bo'ladi.

Python-da API yozish (Flask va RapidAPI bilan)

5. Endi siz API so'nggi nuqtalarini qo'lda kiritishingiz yoki yuklab olishingiz mumkin swagger fayli OpenAPI yordamida.

Python-da API yozish (Flask va RapidAPI bilan)

Xo'sh, endi siz oxirgi nuqtalar sahifasida API so'nggi nuqtalarini o'rnatishingiz kerak. Bizning holatda, so'nggi nuqtalar CRUD kontseptsiyasiga mos keladi (olish, joylashtirish, qo'yish, o'chirish).

Python-da API yozish (Flask va RapidAPI bilan)

Keyinchalik, tasodifiy taklifni (agar ID standart bo'lsa) yoki belgilangan identifikator uchun taklifni ko'rsatadigan GET AI Quote so'nggi nuqtasini yaratishingiz kerak.

Yakuniy nuqta yaratish uchun "Yakuniy nuqta yaratish" tugmasini bosishingiz kerak.

Python-da API yozish (Flask va RapidAPI bilan)

Ushbu jarayonni barcha boshqa API so'nggi nuqtalari uchun takrorlaymiz. Ana xolos! Tabriklaymiz, siz API-ni nashr qildingiz!

Agar hamma narsa yaxshi bo'lsa, API sahifasi quyidagicha ko'rinadi:

Python-da API yozish (Flask va RapidAPI bilan)

xulosa

Ushbu maqolada biz Python-da o'zimizning RESTful API xizmatini yaratish jarayonini, shuningdek API-ni Heroku bulutiga nashr qilish va uni RapidAPI katalogiga qo'shish jarayonini ko'rib chiqdik.

Ammo sinov versiyasida faqat API ishlab chiqishning asosiy tamoyillari ko'rsatilgan - xavfsizlik, nosozliklarga chidamlilik va miqyoslilik kabi nuanslar hisobga olinmagan.

Haqiqiy APIni ishlab chiqishda bularning barchasini hisobga olish kerak.

Manba: www.habr.com

a Izoh qo'shish