Python дээр API бичих (Flask болон RapidAPI-тай)

Python дээр API бичих (Flask болон RapidAPI-тай)

Хэрэв та энэ нийтлэлийг уншиж байгаа бол API (Application Programming Interface) ашиглах үед нээгдэх боломжуудыг аль хэдийн мэддэг болсон байх.

Олон нийтийн API-ийн аль нэгийг өөрийн аппликешндээ нэмснээр та энэ програмын үйл ажиллагааг өргөтгөх эсвэл шаардлагатай мэдээллээр баяжуулах боломжтой. Гэхдээ та олон нийттэй хуваалцахыг хүсч буй өвөрмөц онцлогийг хөгжүүлсэн бол яах вэ?

Хариулт нь энгийн: танд хэрэгтэй өөрийн API үүсгэх.

Энэ нь эхэндээ хэцүү ажил мэт санагдаж болох ч үнэндээ маш энгийн зүйл юм. Үүнийг Python-ээр хэрхэн хийхийг бид танд үзүүлэх болно.

Эхлэхийн тулд юу хэрэгтэй вэ

API хөгжүүлэлт нь дараахь зүйлийг шаарддаг.

  • Python3;
  • Колбо — вэб програм үүсгэх энгийн бөгөөд хэрэглэхэд хялбар хүрээ;
  • Колбо-Амарч байна нь Flask-д зориулсан өргөтгөл бөгөөд REST API-г хурдан бөгөөд хамгийн бага тохиргоотойгоор боловсруулах боломжийг олгодог.

Суурилуулалтыг дараах тушаалаар гүйцэтгэнэ.

pip install flask-restful

Бид эхлэгчдэд зориулсан үнэгүй эрчимтэй програмчлалыг санал болгож байна:
C# хэл дээр Telegram бот хөгжүүлэх - 26-р сарын 28-XNUMX. Туслах роботууд хэрхэн ажилладаг, Telegram API-тай ажиллах онцлог болон бусад нарийн ширийн зүйлийг ойлгох боломжийг олгодог үнэгүй эрчимжүүлсэн програм. Шилдэг гурван оролцогчид Skillbox-оос 30 рубль авах болно.

Эхлэхээсээ өмнө

Бид үндсэн хувилбар бүхий RESTful API хөгжүүлэх гэж байна CRUID функц.

Даалгаврыг бүрэн ойлгохын тулд дээр дурдсан хоёр нэр томъёог ойлгоцгооё.

REST гэж юу вэ?

REST API (Representational State Transfer) нь өгөгдөл солилцохын тулд HTTP хүсэлтийг ашигладаг API юм.

REST API нь тодорхой шалгуурыг хангасан байх ёстой:

  • Үйлчлүүлэгч-серверийн архитектур: үйлчлүүлэгч нь хэрэглэгчийн интерфэйстэй, сервер нь backend болон мэдээллийн сантай харилцдаг. Үйлчлүүлэгч болон сервер нь бие даасан бөгөөд тэдгээрийн аль нэгийг нь нөгөөгөөсөө тусад нь сольж болно.
  • Харьяалалгүй - Сервер дээр үйлчлүүлэгчийн мэдээлэл хадгалагдахгүй. Сеансын төлөв нь үйлчлүүлэгч тал дээр хадгалагдана.
  • Cacheability - Үйлчлүүлэгчид ерөнхий гүйцэтгэлийг сайжруулахын тулд серверийн хариултуудыг кэшлэх боломжтой.

CRUD гэж юу вэ?

RAW нь дөрвөн үндсэн үйлдлийг (үүсгэх, унших, шинэчлэх, устгах) дүрсэлсэн програмчлалын ойлголт юм.

REST API-д хүсэлтийн төрөл болон хүсэлтийн аргууд нь нийтлэх, авах, тавих, устгах зэрэг үйлдлүүдийг хариуцдаг.

Одоо бид үндсэн нөхцлүүдийг авч үзсэн тул API үүсгэж эхлэх боломжтой.

Хөгжил

Хиймэл оюун ухааны талаархи ишлэлүүдийн санг бий болгоцгооё. AI бол өнөөдөр хамгийн хурдацтай хөгжиж буй технологийн нэг бөгөөд Python бол хиймэл оюун ухаантай ажиллах түгээмэл хэрэгсэл юм.

Энэхүү API-ийн тусламжтайгаар Python хөгжүүлэгч AI-ийн талаар хурдан суралцаж, шинэ амжилтуудаас урам зориг авах боломжтой. Хэрэв хөгжүүлэгч энэ сэдвээр үнэ цэнэтэй бодолтой байвал тэдгээрийг хадгалах санд нэмж оруулах боломжтой болно.

Шаардлагатай модулиудыг импортлож, колбыг тохируулж эхэлцгээе:

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 хүсэлтийг задлан шинжлэх интерфейс юм... Мөн санамсаргүй үнийн саналыг харуулахын тулд танд санамсаргүй модуль хэрэгтэй болно.

Одоо бид хиймэл оюун ухааны талаархи ишлэлүүдийн санг үүсгэх болно.

Репо бичлэг бүр дараахь зүйлийг агуулна.

  • дижитал ID;
  • ишлэлийг зохиогчийн нэр;
  • иш татах.

Энэ бол зүгээр л сургалтын жишээ тул бид бүх оруулгыг 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 төгсгөлийн цэгүүдийн үйл ажиллагааг тодорхойлох Quote нөөцийн анги үүсгэх хэрэгтэй. Анги дотор дөрвөн аргыг зарлах ёстой: авах, нийтлэх, тавих, устгах.

GET аргаас эхэлье

Энэ нь танд ID-г нь зааж өгснөөр тодорхой үнийн санал авах, эсвэл ID-г заагаагүй бол санамсаргүй үнийн санал авах боломжийг олгодог.

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 арга нь ID нь анхдагч утгыг агуулж байвал санамсаргүй үнийн саналыг буцаана, i.e. дуудах үед аргын ID-г тохируулаагүй байна.

Хэрэв үүнийг тохируулсан бол арга нь ишлэлүүдийн дунд хайлт хийж, өгөгдсөн ID-г агуулсан нэгийг олно. Хэрэв юу ч олдохгүй бол "Үнийн санал олдсонгүй, 404" гэсэн мессеж гарч ирнэ.

Хэрэв хүсэлт амжилттай болсон бол энэ арга нь HTTP статусыг 200, оруулга олдоогүй бол 404 гэсэн утгыг буцаана гэдгийг санаарай.

Одоо репозитор руу шинэ үнийн санал нэмэх POST аргыг үүсгэцгээе

Энэ нь таныг бичих явцад шинэ ишлэл бүрийн ID-г авах болно. Нэмж дурдахад, 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 арга нь үнийн саналын ID-г хүлээн зөвшөөрсөн. Дараа нь reqparse ашиглан хүсэлтээс зохиогч болон эшлэлийг татан авч, тэдгээрийг params толь бичигт хадгалсан.

Хэрэв заасан ID-тай үнийн санал аль хэдийн байгаа бол арга нь тохирох мессеж болон 400 кодыг харуулна.

Хэрэв заасан ID-тай үнийн санал хараахан үүсгэгдээгүй бол арга нь заасан ID, зохиогч болон бусад параметрүүдтэй шинэ оруулга үүсгэдэг. Дараа нь 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 ашиглан ишлэлийн параметрүүдийг задлан шинжилдэг.

Хэрэв заасан ID-тай ишлэл байгаа бол арга нь түүнийг шинэ параметрүүдээр шинэчилж, дараа нь 200 кодтой шинэчлэгдсэн ишлэлийг гаргана. Хэрэв заасан ID-тай үнийн санал хараахан байхгүй бол 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

Энэ арга нь үнийн саналын ID-г оролт болгон авч, хуваалцсан жагсаалтыг ашиглан 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 товчийг дарна уу)
* Статистик мэдээллээр дахин эхлүүлж байна
* Дебаглагч идэвхтэй байна!
* Дибаглагчийн ПИН: XXXXXXX

API-г туршиж байна

API үүсгэсний дараа үүнийг турших шаардлагатай.

Үүнийг curl консол хэрэгсэл эсвэл Insomnia REST клиент ашиглан эсвэл Rapid API дээр API нийтлэх замаар хийж болно.

Python дээр API бичих (Flask болон RapidAPI-тай)

Манай API-г нийтэлж байна

RapidAPI бол 10 гаруй API (мөн 000 сая орчим хөгжүүлэгч) бүхий дэлхийн хамгийн том зах зээл юм.

RapidAPI нь гуравдагч талын API-уудтай ажиллахад зориулсан ганц интерфейсээр хангаад зогсохгүй өөрийн API-г хурдан бөгөөд хялбар нийтлэх боломжийг олгодог.

Хэрэгтэй Үүнийг хийхийн тулд, та эхлээд үүнийг сүлжээн дэх зарим серверт нийтлэх хэрэгтэй. Манай тохиолдолд бид ашиглах болно Хероку. Түүнтэй ажиллах нь ямар ч хүндрэл учруулах ёсгүй, (та эндээс энэ талаар илүү ихийг олж мэдэх боломжтой).

Хэроку дээр өөрийн API-г хэрхэн нийтлэх вэ

1. Heroku суулгана уу.

Эхний алхам бол Heroku Command Line Interface (CLI)-г бүртгүүлж суулгах явдал юм. Энэ нь Ubuntu 16+ дээр ажилладаг.

sudo snap install heroku --classic

Дараа нь бид нэвтэрнэ үү:

heroku нэвтрэх

2. Шаардлагатай файлуудыг нэмнэ үү.

Одоо бид програмынхаа хавтсанд нийтлэх файлуудыг нэмэх хэрэгтэй:

  • Шаардлагатай Python модулиудын жагсаалтын хамт шаардлага.txt;
  • Программыг ажиллуулахын тулд ямар тушаалуудыг гүйцэтгэх ёстойг зааж өгдөг Procfile;
  • .gitignore - сервер дээр шаардлагагүй файлуудыг оруулахгүй.

requirements.txt файл нь дараах мөрүүдийг агуулна.

  • колбо
  • колбо-тайван
  • бууны эвэр

Бид сервер дээр програмаа ажиллуулах шаардлагатай байгаа тул жагсаалтад gunicorn (Python WSGI HTTP сервер) нэмсэн гэдгийг анхаарна уу.

Профайл нь дараахь зүйлийг агуулна.

вэб: gunicorn програм: апп

.gitignore-н агуулга:

*.pyc
__pycache__/

Файлууд үүсгэгдсэн тул git репо-г эхлүүлж, дараахыг хийцгээе.

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

3. Шинэ Heroku програм үүсгэнэ үү.

heroku create

Мастер салбарыг алсын Хероку репо руу түлхэж байна:

git push heroku master

Одоо та API үйлчилгээг дараах тушаалаар нээж эхэлж болно.

heroku ps:scale web=1
heroku open
 

API-г эндээс авах боломжтой your-random-heroku-name.herokuapp.com/ai-quotes.

RapidAPI зах зээлд өөрийн Python API-г хэрхэн нэмэх вэ

API үйлчилгээг Heroku дээр нийтэлсний дараа та үүнийг Rapid API-д нэмж болно. Энд нарийвчилсан баримт бичиг энэ сэдвээр.

1. RapidAPI данс үүсгэнэ үү.

Python дээр API бичих (Flask болон RapidAPI-тай)

Бид үнэгүй данс бүртгүүлдэг - үүнийг Facebook, Google, GitHub ашиглан хийж болно.

Python дээр API бичих (Flask болон RapidAPI-тай)

2. Хяналтын самбарт API нэмнэ.

Python дээр API бичих (Flask болон RapidAPI-тай)

3. Дараа нь API-нхаа тухай ерөнхий мэдээллийг оруулна уу.

Python дээр API бичих (Flask болон RapidAPI-тай)

4. “Add API” дээр дарсны дараа манай API-ийн талаарх мэдээллийг оруулах шинэ хуудас гарч ирнэ.

Python дээр API бичих (Flask болон RapidAPI-тай)

5. Одоо та API төгсгөлийн цэгүүдийг гараар оруулах эсвэл татаж авах боломжтой swagger файл OpenAPI ашиглан.

Python дээр API бичих (Flask болон RapidAPI-тай)

За, одоо та манай API-ийн төгсгөлийн цэгүүдийг Төгсгөлийн цэгүүд дээр тохируулах хэрэгтэй. Манай тохиолдолд төгсгөлийн цэгүүд нь CRUD (авах, байршуулах, тавих, устгах) ойлголттой тохирч байна.

Python дээр API бичих (Flask болон RapidAPI-тай)

Дараа нь та санамсаргүй үнийн санал (хэрэв ID нь анхдагч бол) эсвэл заасан ID-д зориулсан үнийн саналыг харуулах GET AI Quote төгсгөлийн цэгийг үүсгэх хэрэгтэй.

Төгсгөлийн цэг үүсгэхийн тулд та "Төгсгөлийн цэг үүсгэх" товчийг дарах хэрэгтэй.

Python дээр API бичих (Flask болон RapidAPI-тай)

Бид бусад бүх API төгсгөлийн цэгүүдэд энэ үйл явцыг давтана. Тэгээд л болоо! Баяр хүргэе, та API-аа нийтэллээ!

Хэрэв бүх зүйл сайн байвал API хуудас иймэрхүү харагдах болно:

Python дээр API бичих (Flask болон RapidAPI-тай)

дүгнэлт

Энэ нийтлэлд бид Python-д өөрийн RESTful API үйлчилгээг бий болгох үйл явц, API-г Heroku үүлэн дээр нийтэлж, RapidAPI лавлах руу нэмэх үйл явцтай танилцсан.

Гэхдээ туршилтын хувилбарт зөвхөн API хөгжүүлэх үндсэн зарчмуудыг харуулсан - аюулгүй байдал, алдааны тэсвэрлэх чадвар, өргөтгөх чадвар зэрэг нюансуудыг авч үзээгүй.

Бодит API боловсруулахдаа энэ бүгдийг анхаарч үзэх хэрэгтэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх