Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Kung binabasa mo ang artikulong ito, malamang na pamilyar ka na sa mga posibilidad na kasama ng paggamit ng API (Application Programming Interface).

Sa pamamagitan ng pagdaragdag ng isa sa maraming bukas na API sa iyong application, maaari mong palawigin ang functionality ng application o pagyamanin ito ng kinakailangang data. Ngunit paano kung bumuo ka ng isang natatanging tampok na gusto mong ibahagi sa komunidad?

Ang sagot ay simple: kailangan mo lumikha ng iyong sariling API.

Kahit na ito ay maaaring mukhang isang mahirap na gawain sa simula, ito ay talagang simple. Ipapakita namin sa iyo kung paano ito gawin gamit ang Python.

Ano ang kailangan mo para makapagsimula

Upang bumuo ng isang API kailangan mo:

  • Python3;
  • Prasko β€” isang simple at madaling gamitin na balangkas para sa paglikha ng mga web application;
  • Prasko-NAGPAHINGAT ay isang extension para sa Flask na nagbibigay-daan sa iyong bumuo ng REST API nang mabilis at may kaunting configuration.

Ang pag-install ay isinasagawa gamit ang utos:

pip install flask-restful

Inirerekomenda namin ang isang libreng intensive programming course para sa mga nagsisimula:
Pag-unlad ng Telegram bot sa C# β€” Agosto 26–28. Isang libreng masinsinang kurso na nagbibigay-daan sa iyong maunawaan kung paano gumagana ang mga assistant bot, ang mga detalye ng pagtatrabaho sa Telegram API at iba pang mga nuances. Ang tatlong pinakamahusay na kalahok ay makakatanggap ng 30 rubles mula sa Skillbox.

Bago ka magsimula

Kami ay bubuo ng isang RESTful API na may basic CRUID functionality.

Upang lubos na maunawaan ang gawain, unawain natin ang dalawang terminong nabanggit sa itaas.

Ano ang REST?

Ang REST API (Representational State Transfer) ay isang API na gumagamit ng mga kahilingan sa HTTP upang makipagpalitan ng data.

Dapat matugunan ng mga REST API ang ilang partikular na pamantayan:

  • Arkitektura ng Client-server: Nakikipag-ugnayan ang kliyente sa interface ng gumagamit, at nakikipag-ugnayan ang server sa backend at imbakan ng data. Ang kliyente at server ay independiyente, alinman sa mga ito ay maaaring palitan nang hiwalay sa isa pa.
  • Stateless - walang data ng kliyente na nakaimbak sa server. Ang katayuan ng session ay naka-imbak sa panig ng kliyente.
  • Cacheability - Maaaring i-cache ng mga kliyente ang mga tugon ng server upang mapabuti ang pangkalahatang pagganap.

Ano ang CRUD?

RAW ay isang konsepto ng programming na naglalarawan ng apat na pangunahing aksyon (lumikha, magbasa, mag-update at magtanggal).

Sa REST API, ang mga uri ng kahilingan at mga paraan ng kahilingan ay responsable para sa mga aksyon tulad ng pag-post, pagkuha, ilagay, tanggalin.

Ngayong nauunawaan na natin ang mga pangunahing termino, maaari na nating simulan ang paggawa ng API.

Development

Gumawa tayo ng repository ng mga quotes tungkol sa artificial intelligence. Ang AI ay isa sa pinakamabilis na lumalagong teknolohiya ngayon, at ang Python ay isang sikat na tool para sa pagtatrabaho sa AI.

Gamit ang API na ito, ang isang developer ng Python ay maaaring mabilis na makakuha ng impormasyon tungkol sa AI at makakuha ng inspirasyon ng mga bagong pag-unlad. Kung ang isang developer ay may mahalagang mga saloobin sa paksang ito, magagawa niyang idagdag ang mga ito sa repositoryo.

Magsimula tayo sa pamamagitan ng pag-import ng mga kinakailangang module at pag-set up ng Flask:

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

Sa snippet na ito, Flask, Api at Resource ang mga klase na kailangan namin.

Ang Reqparse ay isang Flask-RESTful query parsing interface... Kakailanganin mo rin ang isang random na module upang magpakita ng isang random na quote.

Ngayon ay gagawa kami ng repositoryo ng mga quote tungkol sa AI.

Ang bawat repo entry ay naglalaman ng:

  • digital ID;
  • pangalan ng may-akda ng sipi;
  • quote.

Dahil ito ay halimbawa lamang ng pagsasanay, iimbak namin ang lahat ng mga entry sa isang listahan ng Python. Sa isang tunay na aplikasyon, malamang na gumamit kami ng database sa halip.

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

Ngayon ay kailangan naming lumikha ng isang Quote resource class na tutukuyin ang mga pagpapatakbo ng aming mga API endpoint. Sa loob ng klase kailangan mong magdeklara ng apat na paraan: kumuha, mag-post, maglagay, magtanggal.

Magsimula tayo sa pamamaraang GET

Ginagawa nitong posible na makakuha ng isang partikular na quote sa pamamagitan ng pagtukoy sa ID nito, o isang random na quote kung ang ID ay hindi tinukoy.

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

Ang GET method ay nagbabalik ng random na quote kung ang ID ay naglalaman ng default na value, i.e. walang tinukoy na ID kapag tumatawag sa pamamaraan.

Kung ito ay tinukoy, ang pamamaraan ay naghahanap sa pagitan ng mga pagsipi at hinahanap ang isa na naglalaman ng tinukoy na ID. Kung walang mahanap, ang mensaheng "Quote not found, 404" ay ipapakita.

Tandaan: ang paraan ay nagbabalik ng HTTP status na 200 kung ang kahilingan ay matagumpay at 404 kung ang rekord ay hindi natagpuan.

Ngayon, gumawa tayo ng POST method para magdagdag ng bagong quote sa repository

Makukuha nito ang ID ng bawat bagong quote habang nagta-type ka. Bilang karagdagan, gagamit ang POST ng reqparse para i-parse ang mga parameter na mapupunta sa katawan ng kahilingan (may-akda at teksto ng quote).

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

Sa code sa itaas, tinanggap ng POST method ang quote ID. Pagkatapos, gamit ang reqparse, nakuha nito ang may-akda at sipi mula sa query, na iniimbak ang mga ito sa diksyunaryo ng params.

Kung mayroon nang quote na may tinukoy na ID, ang pamamaraan ay nagpapakita ng kaukulang mensahe at code 400.

Kung ang isang pagsipi na may tinukoy na ID ay hindi pa nagagawa, ang pamamaraan ay gagawa ng isang bagong tala na may tinukoy na ID at may-akda, pati na rin ang iba pang mga parameter. Pagkatapos ay idinaragdag nito ang entry sa listahan ng ai_quotes at ibinabalik ang entry na may bagong quote kasama ang isang 201 code.

Ngayon ay lumikha kami ng isang paraan ng PUT upang baguhin ang isang umiiral na quote sa repositoryo

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

Ang paraan ng PUT, katulad ng naunang halimbawa, ay kumukuha ng ID at input at na-parse ang mga parameter ng quote gamit ang reqparse.

Kung mayroong isang pagsipi na may tinukoy na ID, ia-update ito ng pamamaraan kasama ang mga bagong parameter at pagkatapos ay ilalabas ang na-update na pagsipi na may code 200. Kung wala pang pagsipi na may tinukoy na ID, isang bagong tala na may code 201 ang gagawin.

Sa wakas, gumawa tayo ng paraan ng DELETE para maalis ang isang quote na hindi na nagbibigay inspirasyon

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

Nakukuha ng paraang ito ang quote ID bilang input at ina-update ang listahan ng ai_quotes gamit ang nakabahaging listahan.

Ngayong nagawa na namin ang lahat ng pamamaraan, ang kailangan lang naming gawin ay magdagdag lamang ng mapagkukunan sa API, itakda ang landas, at patakbuhin ang Flask.

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

Ang aming REST API Service ay handa na!

Susunod, maaari naming i-save ang code sa app.py file sa pamamagitan ng pagpapatakbo nito sa console gamit ang command:

python3 app.py

Kung ang lahat ay mabuti, makakakuha tayo ng ganito:

* Debug mode: naka-on
* Tumatakbo sa 127.0.0.1:5000/ (Pindutin ang CTRL+C para huminto)
* Nagsisimula sa stat
* Aktibo ang debugger!
* Debugger PIN: XXXXXXX

Pagsubok sa API

Kapag nalikha na ang API, kailangan itong masuri.

Magagawa ito gamit ang curl console utility o ang Insomnia REST client, o sa pamamagitan ng pag-publish ng API sa Rapid API.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Pag-publish ng aming API

Ang RapidAPI ay ang pinakamalaking marketplace sa mundo na may higit sa 10 API (at humigit-kumulang 000 milyong developer).

Ang RapidAPI ay hindi lamang nagbibigay ng isang interface para sa pagtatrabaho sa mga third-party na API, ngunit nagbibigay din sa iyo ng kakayahang mabilis at madaling i-publish ang iyong sariling API.

Sa na gawin ito, kailangan mo munang i-publish ito sa ilang server sa network. Sa aming kaso gagamitin namin Heroku. Ang pagtatrabaho kasama nito ay hindi dapat magdulot ng anumang kahirapan, (maaari mong malaman ang higit pa tungkol sa kanya dito).

Paano I-publish ang Iyong API sa Heroku

1. I-install ang Heroku.

Ang unang hakbang ay ang pagrehistro at pag-install ng Heroku Command Line Interface (CLI). Gumagana ito sa Ubuntu 16+.

sudo snap install heroku β€”classic

Pagkatapos ay mag-login:

heroku login

2. Idagdag ang mga kinakailangang file.

Ngayon ay kailangan naming idagdag ang mga file na mai-publish sa isang folder sa aming application:

  • requirements.txt na may listahan ng mga kinakailangang module ng Python;
  • Procfile, na tumutukoy kung anong mga utos ang dapat isagawa upang patakbuhin ang application;
  • .gitignore - upang ibukod ang mga file na hindi kailangan sa server.

Ang requirements.txt file ay maglalaman ng mga sumusunod na linya:

  • prasko
  • prasko-matahimik
  • gunicorn

Pakitandaan na nagdagdag kami ng gunicorn (Python WSGI HTTP Server) sa listahan dahil kailangan naming patakbuhin ang aming application sa server.

Ang profile ay maglalaman ng:

web: gunicorn app:app

Mga nilalaman ng .gitignore:

*.pyc
__pycache__/

Ngayong nalikha na ang mga file, simulan natin ang git repo at i-commit:

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

3. Gumawa ng bagong Heroku application.

heroku create

Itinutulak namin ang master branch sa malayong Heroku repo:

git push heroku master

Ngayon ay maaari kang magsimula sa pamamagitan ng pagbubukas ng Serbisyo ng API gamit ang mga utos:

heroku ps:scale web=1
heroku open
 

Ang API ay magiging available sa your-random-heroku-name.herokuapp.com/ai-quotes.

Paano idagdag ang iyong Python API sa RapidAPI marketplace

Kapag na-publish na ang iyong serbisyo ng API sa Heroku, maaari mo itong idagdag sa Rapid API. Dito detalyadong dokumentasyon sa paksang ito.

1. Gumawa ng RapidAPI account.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Magrehistro ng isang libreng account - maaari itong gawin gamit ang Facebook, Google, GitHub.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

2. Idagdag ang API sa control panel.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

3. Susunod, ilagay ang pangkalahatang impormasyon tungkol sa iyong API.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

4. Pagkatapos i-click ang "Magdagdag ng API" isang bagong pahina ang lalabas kung saan maaari kang maglagay ng impormasyon tungkol sa aming API.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

5. Ngayon ay maaari mong manu-manong ipasok ang mga endpoint ng API o i-download swagger-file gamit ang OpenAPI.

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Kaya, ngayon kailangan nating itakda ang mga endpoint ng ating API sa pahina ng Mga Endpoint. Sa aming kaso, ang mga endpoint ay tumutugma sa konsepto ng CRUD (kumuha, mag-post, maglagay, magtanggal).

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Susunod, kailangan mong gumawa ng GET AI Quote endpoint na nagpapakita ng random na quote (kung default ang ID) o isang quote para sa tinukoy na ID.

Upang gumawa ng endpoint, i-click ang button na "Gumawa ng Endpoint".

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Inuulit namin ang prosesong ito para sa lahat ng iba pang mga endpoint ng API. Iyon lang! Binabati kita, nai-publish mo ang iyong API!

Kung maayos ang lahat, magiging ganito ang hitsura ng pahina ng API:

Pagsusulat ng API sa Python (na may Flask at RapidAPI)

Konklusyon

Sa artikulong ito, natutunan namin ang proseso ng paggawa ng sarili mong RESTful API Service sa Python, kasama ang proseso ng pag-publish ng API sa Heroku cloud at pagdaragdag nito sa RapidAPI na direktoryo.

Ngunit ang pagsubok na bersyon ay nagpakita lamang ng mga pangunahing prinsipyo ng pag-unlad ng API - ang mga nuances tulad ng seguridad, fault tolerance at scalability ay hindi isinasaalang-alang.

Kapag bumubuo ng isang tunay na API, ang lahat ng ito ay kailangang isaalang-alang.

Pinagmulan: www.habr.com

Magdagdag ng komento