Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Kung nagbasa ka niini nga artikulo, lagmit pamilyar ka sa mga posibilidad nga maablihan kung gamiton ang API (Application Programming Interface).

Pinaagi sa pagdugang sa usa sa daghang mga publikong API sa imong aplikasyon, mahimo nimong mapalawig ang pagpaandar niini nga aplikasyon o madugangan kini sa kinahanglan nga datos. Apan komosta kon nakaugmad ka ug talagsaong bahin nga gusto nimong ipaambit sa komunidad?

Ang tubag yano ra: kinahanglan nimo paghimo sa imong kaugalingon nga API.

Bisan kung kini ingon usa ka makahahadlok nga buluhaton sa sinugdan, kini sa tinuud yano ra. Ipakita namon kanimo kung giunsa kini buhaton gamit ang Python.

Unsa ang imong kinahanglan sa pagsugod

Ang pag-uswag sa API nanginahanglan:

  • Python3;
  • Flask β€” usa ka yano ug dali gamiton nga balangkas alang sa paghimo sa mga aplikasyon sa web;
  • Prasko-MAHULOG mao ang usa ka extension alang sa Flask nga nagtugot kaninyo sa paghimo sa usa ka REST API sa madali ug uban sa gamay nga configuration.

Ang pag-instalar gihimo pinaagi sa mando:

pip install flask-restful

Girekomenda namon ang usa ka libre nga intensive programming alang sa mga nagsugod:
Pag-uswag sa Telegram bot sa C# β€” Agosto 26–28. Usa ka libre nga intensive nga nagtugot kanimo nga masabtan kung giunsa ang pagtrabaho sa mga helper bot, ang mga bahin sa pagtrabaho kauban ang Telegram API ug uban pang mga nuances. Ang nag-unang tulo ka mga partisipante makadawat og 30 nga mga rubles gikan sa Skillbox.

Sa dili ka pa magsugod

Maghimo kami usa ka RESTful API nga adunay sukaranan CRUID nga pagpaandar.

Aron hingpit nga masabtan ang buluhaton, atong sabton ang duha ka termino nga gihisgotan sa ibabaw.

Unsa ang REST?

Ang REST API (Representational State Transfer) usa ka API nga naggamit sa mga hangyo sa HTTP aron magbayloay og datos.

Ang mga REST API kinahanglang makaabot sa pipila ka mga criteria:

  • Client-server architecture: ang kliyente nakig-interact sa user interface, ug ang server nakig-interact sa backend ug data store. Ang kliyente ug server independente, bisan kinsa kanila mahimong mapulihan nga gilain gikan sa lain.
  • Stateless - Walay data sa kliyente nga gitipigan sa server. Ang kahimtang sa sesyon gitipigan sa kilid sa kliyente.
  • Cacheability - Mahimong cache sa mga kliyente ang mga tubag sa server aron mapaayo ang kinatibuk-ang pasundayag.

Unsa ang CRUD?

SI KRUD usa ka konsepto sa pagprograma nga naghulagway sa upat ka sukaranan nga mga aksyon (paghimo, pagbasa, pag-update ug pagtangtang).

Sa REST API, ang mga tipo sa hangyo ug mga pamaagi sa paghangyo responsable sa mga aksyon sama sa pag-post, pagkuha, pagbutang, pagtangtang.

Karon nga nakuha na namo ang mga sukaranan, andam na kami sa pagsugod sa pagtukod sa API.

Pagpalambo

Maghimo ta ug repository sa mga kinutlo bahin sa artificial intelligence. Ang AI usa sa labing paspas nga nagtubo nga teknolohiya karon, ug ang Python usa ka sikat nga himan alang sa pagtrabaho kauban ang AI.

Uban niini nga API, ang usa ka developer sa Python dali nga makakat-on bahin sa AI ug madasig sa mga bag-ong nahimo. Kung ang developer adunay bililhon nga mga hunahuna bahin niini nga hilisgutan, mahimo niya kini idugang sa repositoryo.

Magsugod kita pinaagi sa pag-import sa gikinahanglan nga mga module ug pag-set up sa Flask:

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

Niini nga snippet, Flask, Api ug Resource ang mga klase nga atong gikinahanglan.

Ang Reqparse kay usa ka Flask-RESTful request parsing interface... Kinahanglan nimo ang random module para magpakita ug random quote.

Karon maghimo kami usa ka repository sa mga kinutlo bahin sa AI.

Ang matag repo entry adunay sulod:

  • digital ID;
  • ang ngalan sa tagsulat sa kinutlo;
  • kinutlo.

Tungod kay kini usa ra ka pananglitan sa pagkat-on, among tipigan ang tanan nga mga entri sa usa ka lista sa Python. Sa usa ka tinuud nga aplikasyon, lagmit nga mogamit kami usa ka database sa baylo.

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

Karon kinahanglan namong maghimo ug Quote resource class nga maghubit sa mga operasyon sa among API endpoints. Upat ka pamaagi ang kinahanglang ideklara sulod sa klase: get, post, put, delete.

Magsugod ta sa GET nga pamaagi

Gitugotan ka niini nga makakuha usa ka piho nga kinutlo pinaagi sa pagtino sa ID niini, o usa ka random nga kinutlo kung wala’y gipiho nga 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

Ang GET nga pamaagi nagbalik sa usa ka random nga kinutlo kung ang ID naglangkob sa default nga kantidad, i.e. walay ID nga gipiho sa pagtawag sa pamaagi.

Kung kini gitakda, nan ang pamaagi mangita sa mga kinutlo ug makit-an ang usa nga adunay sulud nga gihatag nga ID. Kung walay makit-an, ang mensahe nga "Wala makit-an ang quote, 404" gipakita.

Hinumdomi, ang pamaagi nagbalik sa HTTP status nga 200 kung ang hangyo malampuson ug 404 kung ang entry wala makit-an.

Karon maghimo kita og POST nga pamaagi aron makadugang og bag-ong kinutlo sa repository

Makuha niini ang id sa matag bag-ong kinutlo samtang nag-type ka. Dugang pa, gamiton sa POST ang reqparse aron ma-parse ang mga parameter nga moadto sa lawas sa hangyo (awtor ug kinutlo nga teksto).

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 ibabaw, ang POST nga pamaagi midawat ug quote ID. Dayon, gamit ang reqparse, gikuha niini ang tagsulat ug gikutlo gikan sa hangyo, gitipigan kini sa diksyonaryo sa params.

Kung adunay usa ka kinutlo nga adunay piho nga ID, nan ang pamaagi nagpakita sa angay nga mensahe ug code 400.

Kung ang usa ka kinutlo nga adunay espesipikong ID wala pa nahimo, ang pamaagi maghimo usa ka bag-ong entry nga adunay gitakda nga ID ug tagsulat, ingon man ang uban pang mga parameter. Dayon kini magdugang og entry sa ai_quotes list ug mobalik og entry nga adunay bag-ong quote uban ang 201 code.

Karon naghimo kami usa ka PUT nga pamaagi aron mabag-o ang usa ka kasamtangan nga kinutlo sa repository

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 PUT nga pamaagi, susama sa miaging pananglitan, nagkuha ug ID ug usa ka input ug gi-parse ang mga parameter sa quote gamit ang reqparse.

Kung adunay usa ka kinutlo nga adunay gipiho nga ID, ang pamaagi mag-update niini sa bag-ong mga parameter ug dayon magpagawas sa na-update nga kinutlo nga adunay code 200. Kung wala pa ang kinutlo nga adunay piho nga ID, usa ka bag-ong rekord nga adunay code 201 ang himuon.

Sa kataposan, maghimo ta ug DELETE nga pamaagi para matangtang ang kinutlo nga dili na makapadasig.

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

Kini nga pamaagi nagkuha sa quote ID isip input ug nag-update sa listahan sa ai_quotes gamit ang shared list.

Karon nga nahimo na namon ang tanan nga mga pamaagi, ang kinahanglan namong buhaton mao ang pagdugang lamang sa kapanguhaan sa API, pagtakda sa agianan, ug pagdagan ang Flask.

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

Andam na ang among REST API Service!

Sunod, mahimo natong i-save ang code sa app.py file pinaagi sa pagpadagan niini sa console gamit ang command:

python3 app.py

Kung maayo ang tanan, nan makakuha kami usa ka butang nga sama niini:

* Debug mode: on
* Nagdagan 127.0.0.1:5000/ (I-press ang CTRL+C para moundang)
* Pagsugod pag-usab sa stat
* Aktibo ang debugger!
* Debugger PIN: XXXXXXX

Pagsulay sa API

Human mabuhat ang API, kini kinahanglan nga sulayan.

Mahimo kini gamit ang curl console utility o ang Insomnia REST nga kliyente, o pinaagi sa pagmantala sa API sa Rapid API.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Pagmantala sa among API

Ang RapidAPI mao ang pinakadako nga merkado sa kalibutan nga adunay sobra sa 10 ka mga API (ug mga 000 milyon nga mga developer).

Ang RapidAPI dili lamang naghatag ug usa ka interface alang sa pagtrabaho sa mga third-party nga API, apan nagtugot usab kanimo nga dali ug dali nga mamantala ang imong kaugalingon nga API.

Sa buhata, kinahanglan una nimo nga imantala kini sa pipila ka server sa network. Sa among kaso, among gamiton Heroku. Ang pagtrabaho uban kaniya kinahanglan dili magpahinabog bisan unsang mga kalisdanan, (mahimo nimong mahibal-an ang dugang bahin kaniya dinhi).

Giunsa I-publish ang Imong API sa Heroku

1. I-install ang Heroku.

Ang unang lakang mao ang pagparehistro ug pag-instalar sa Heroku Command Line Interface (CLI). Naglihok kini sa Ubuntu 16+.

sudo snap install heroku --classic

Unya mi log in:

heroku login

2. Idugang ang gikinahanglan nga mga file.

Karon kinahanglan namong idugang ang mga file aron ma-publish sa usa ka folder sa among aplikasyon:

  • requirements.txt nga adunay listahan sa gikinahanglan nga Python modules;
  • Procfile, nga nagtino kung unsang mga mando ang kinahanglan ipatuman aron madagan ang aplikasyon;
  • .gitignore - aron dili iapil ang mga file nga wala kinahanglana sa server.

Ang requirements.txt file maglangkob sa mosunod nga mga linya:

  • baso
  • flask-makapahuway
  • gunicorn

Palihug timan-i nga gidugang namo ang gunicorn (Python WSGI HTTP Server) sa lista tungod kay kinahanglan namong ipadagan ang among aplikasyon sa server.

Ang profile adunay sulod:

web: gunicorn app: app

Sulod sa .giignore:

*.pyc
__pycache__/

Karon nga ang mga file nahimo na, atong sugdan ang git repo ug i-commit:

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

3. Paghimo og bag-ong Heroku app.

heroku create

Pagduso sa master branch sa hilit nga Heroku repo:

git push heroku master

Karon mahimo ka magsugod pinaagi sa pag-abli sa Serbisyo sa API gamit ang mga mando:

heroku ps:scale web=1
heroku open
 

Ang API mahimong magamit sa imong-random-heroku-name.herokuapp.com/ai-quotes.

Giunsa idugang ang imong Python API sa merkado sa RapidAPI

Sa higayon nga mamantala ang serbisyo sa API sa Heroku, mahimo nimong idugang kini sa Rapid API. Dinhi detalyado nga dokumentasyon sa kini nga hilisgutan.

1. Paghimo ug RapidAPI account.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Nagparehistro kami og libre nga account - mahimo kini gamit ang Facebook, Google, GitHub.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

2. Idugang ang API sa control panel.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

3. Sunod, pagsulod sa kinatibuk-ang impormasyon bahin sa imong API.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

4. Human sa pag-klik sa "Add API" usa ka bag-ong panid ang makita diin ikaw makasulod sa impormasyon mahitungod sa among API.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

5. Karon mahimo nimo nga mano-mano ang pagsulod sa mga endpoint sa API, o pag-download swagger file gamit ang OpenAPI.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Aw, karon kinahanglan nimong itakda ang mga endpoint sa among API sa Endpoints page. Sa among kaso, ang mga endpoint katumbas sa konsepto sa CRUD (pagkuha, pag-post, pagbutang, pagtangtang).

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Sunod, kinahanglan ka maghimo usa ka GET AI Quote endpoint nga nagpakita sa usa ka random nga kinutlo (kung ang ID mao ang default) o usa ka kinutlo alang sa gitakda nga ID.

Aron makahimo og usa ka endpoint, kinahanglan nimo nga i-klik ang "Create Endpoint" nga buton.

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

Among gisubli kini nga proseso para sa tanang uban pang mga endpoint sa API. Mao ra na! Congratulations, imong gipatik ang imong API!

Kung maayo ang tanan, ang panid sa API mahimong sama niini:

Pagsulat og API sa Python (uban ang Flask ug RapidAPI)

konklusyon

Niini nga artikulo, naglakaw kami sa proseso sa paghimo sa among kaugalingon nga RESTful API Service sa Python, kauban ang proseso sa pagmantala sa API sa Heroku cloud ug gidugang kini sa RapidAPI directory.

Apan sa pagsulay nga bersyon, ang mga sukaranan nga mga prinsipyo sa pag-uswag sa API lamang ang gipakita - ang mga nuances sama sa seguridad, pagtugot sa sayup ug pagkadako wala gikonsiderar.

Kung nagpalambo sa usa ka tinuod nga API, kining tanan kinahanglan nga tagdon.

Source: www.habr.com

Idugang sa usa ka comment