Kitba ta' API f'Python (bil-Flask u RapidAPI)

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Jekk qed taqra dan l-artikolu, probabilment int diġà familjari mal-possibbiltajiet li jiġu mal-użu ta' API (Application Programming Interface).

Billi żżid waħda mill-ħafna APIs miftuħa mal-applikazzjoni tiegħek, tista' testendi l-funzjonalità tal-applikazzjoni jew tarrikkixxiha bid-dejta meħtieġa. Imma x'jiġri jekk tiżviluppa karatteristika unika li trid taqsam mal-komunità?

It-tweġiba hija sempliċi: għandek bżonn oħloq l-API tiegħek stess.

Għalkemm dan jista 'jidher biċċa xogħol diffiċli għall-ewwel, fil-fatt huwa sempliċi. Aħna ser nuruk kif tagħmel dan billi tuża Python.

Dak li għandek bżonn biex tibda

Biex tiżviluppa API għandek bżonn:

  • Python 3;
  • Garafina — qafas sempliċi u faċli biex jintuża għall-ħolqien ta' applikazzjonijiet tal-web;
  • Flixkun-MIĦID hija estensjoni għal Flask li tippermettilek tiżviluppa REST API malajr u b'konfigurazzjoni minima.

L-installazzjoni ssir bil-kmand:

pip install flask-restful

Nirrakkomandaw kors ta' programmar intensiv b'xejn għal dawk li jibdew:
Żvilupp tal-bot tat-telegramma f'C# — 26–28 ta’ Awwissu. Kors intensiv b'xejn li jippermettilek tifhem kif jaħdmu l-assistenti tal-bots, l-ispeċifiċitajiet ta 'ħidma mal-API Telegram u sfumaturi oħra. L-aħjar tliet parteċipanti se jirċievu 30 rublu minn Skillbox.

Qabel ma tibda

Se niżviluppaw API RESTful b'bażiku Funzjonalità CRUID.

Biex tifhem bis-sħiħ il-kompitu, ejja nifhmu ż-żewġ termini msemmija hawn fuq.

X'inhu REST?

REST API (Representational State Transfer) hija API li tuża talbiet HTTP biex tiskambja dejta.

L-API REST għandhom jissodisfaw ċerti kriterji:

  • Arkitettura klijent-server: Il-klijent jinteraġixxi mal-interface tal-utent, u s-server jinteraġixxi mal-backend u l-ħażna tad-dejta. Il-klijent u s-server huma indipendenti, kwalunkwe wieħed minnhom jista 'jiġi sostitwit separatament mill-ieħor.
  • Apolid - l-ebda data tal-klijent ma hija maħżuna fuq is-server. L-istat tas-sessjoni huwa maħżun fuq in-naħa tal-klijent.
  • Cacheability - Il-klijenti jistgħu jaħżnu r-risponsi tas-server biex itejbu l-prestazzjoni ġenerali.

X'inhu CRUD?

MHUX RAFFINAT huwa kunċett ta' programmazzjoni li jiddeskrivi erba' azzjonijiet bażiċi (toħloq, aqra, aġġorna u ħassar).

Fl-API REST, it-tipi ta 'rikjesti u l-metodi ta' rikjesta huma responsabbli għal azzjonijiet bħal post, ġib, poġġi, ħassar.

Issa li nifhmu t-termini bażiċi, nistgħu nibdew noħolqu l-API.

Żvilupp

Ejja noħolqu repożitorju ta' kwotazzjonijiet dwar intelliġenza artifiċjali. L-AI hija waħda mit-teknoloġiji li qed jikbru b'rata mgħaġġla llum, u Python hija għodda popolari biex taħdem mal-AI.

B'din l-API, żviluppatur Python jista' malajr jikseb informazzjoni dwar l-AI u jiġi ispirat minn avvanzi ġodda. Jekk żviluppatur ikollu ħsibijiet siewja dwar dan is-suġġett, ikun jista 'jżidhom mar-repożitorju.

Ejja nibdew billi timporta l-moduli meħtieġa u nwaqqaf Flask:

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

F'dan is-snippet, Flask, Api u Resource huma l-klassijiet li neħtieġu.

Reqparse huwa interface għall-analiżi tal-mistoqsijiet Flask-RESTful... Ikollok bżonn ukoll modulu każwali biex turi kwotazzjoni każwali.

Issa se noħolqu repożitorju ta' kwotazzjonijiet dwar l-AI.

Kull entrata repo se jkun fiha:

  • ID diġitali;
  • isem l-awtur tal-kwotazzjoni;
  • kwotazzjoni.

Peress li dan huwa biss eżempju ta 'taħriġ, aħna se naħżnu l-entrati kollha f'lista Python. F'applikazzjoni reali, x'aktarx nużaw database minflok.

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

Issa rridu noħolqu klassi tar-riżorsi Quote li tiddefinixxi l-operazzjonijiet tal-endpoints tal-API tagħna. Ġewwa l-klassi trid tiddikjara erba' metodi: tikseb, poġġi, tpoġġi, tħassar.

Nibdew bil-metodu GET

Jagħmilha possibbli li tinkiseb kwotazzjoni speċifika billi tispeċifika l-ID tagħha, jew kwotazzjoni każwali jekk l-ID ma tkunx speċifikata.

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

Il-metodu GET jirritorna kwotazzjoni każwali jekk l-ID ikun fih il-valur default, i.e. l-ebda ID ma ġiet speċifikata meta sejjaħ il-metodu.

Jekk ikun speċifikat, allura l-metodu jfittex fost iċ-ċitazzjonijiet u jsib dak li fih l-ID speċifikat. Jekk ma jinstab xejn, jintwera l-messaġġ "Kwotazzjoni mhux misjuba, 404".

Ftakar: il-metodu jirritorna status HTTP ta '200 jekk it-talba kienet ta' suċċess u 404 jekk ir-rekord ma nstabx.

Issa ejja noħolqu metodu POST biex iżżid kwotazzjoni ġdida mar-repożitorju

Se tikseb l-ID ta 'kull kwotazzjoni ġdida kif ittajpja. Barra minn hekk, POST se juża reqparse biex janalizza l-parametri li se jmorru fil-korp tat-talba (awtur u kwotazzjoni tat-test).

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

Fil-kodiċi ta 'hawn fuq, il-metodu POST aċċetta l-ID tal-kwotazzjoni. Imbagħad, bl-użu ta 'reqparse, irkuprat l-awtur u ċ-ċitazzjoni mill-mistoqsija, u ħażenhom fid-dizzjunarju params.

Jekk kwotazzjoni bl-ID speċifikata diġà teżisti, il-metodu juri messaġġ korrispondenti u kodiċi 400.

Jekk ċitazzjoni bl-ID speċifikata għadha ma nħolqotx, il-metodu joħloq rekord ġdid bl-ID u l-awtur speċifikati, kif ukoll parametri oħra. Imbagħad iżid id-dħul mal-lista ai_quotes u jirritorna l-entrata bil-kwotazzjoni l-ġdida flimkien ma 'kodiċi 201.

Issa noħolqu metodu PUT biex nibdlu kwotazzjoni eżistenti fir-repożitorju

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

Il-metodu PUT, simili għall-eżempju preċedenti, jieħu ID u input u janalizza l-parametri tal-kwotazzjoni billi juża reqparse.

Jekk teżisti ċitazzjoni bl-ID speċifikata, il-metodu jaġġornaha bil-parametri l-ġodda u mbagħad joħroġ iċ-ċitazzjoni aġġornata bil-kodiċi 200. Jekk għad m'hemmx ċitazzjoni bl-ID speċifikata, jinħoloq rekord ġdid bil-kodiċi 201.

Fl-aħħarnett, ejja noħolqu metodu DELETE biex tneħħi kwotazzjoni li m'għadhiex tispira

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

Dan il-metodu jikseb l-ID tal-kwotazzjoni bħala input u jaġġorna l-lista ai_quotes billi juża l-lista kondiviża.

Issa li ħloqna l-metodi kollha, kull ma rridu nagħmlu huwa sempliċiment inżidu riżors mal-API, issettja t-triq, u nħaddem Flask.

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

Is-Servizz tal-API REST tagħna huwa lest!

Sussegwentement, nistgħu nsalvaw il-kodiċi fil-fajl app.py billi nħaddmu fil-console billi tuża l-kmand:

python3 app.py

Jekk kollox huwa tajjeb, allura nieħdu xi ħaġa bħal din:

* Modalità debug: mixgħula
* Jiġri fuq 127.0.0.1:5000/ (Agħfas CTRL+C biex tieqaf)
* Tibda mill-ġdid bl-istat
* Debugger huwa attiv!
* PIN tad-debugger: XXXXXXX

Ittestjar tal-API

Ladarba tinħoloq l-API, jeħtieġ li tiġi ttestjata.

Dan jista 'jsir billi tuża l-utilità curl console jew il-klijent Insomnia REST, jew billi tippubblika l-API fuq Rapid API.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Il-pubblikazzjoni tal-API tagħna

RapidAPI huwa l-akbar suq fid-dinja b'aktar minn 10 API (u madwar miljun żviluppatur).

RapidAPI mhux biss jipprovdi interface wieħed biex taħdem ma 'APIs ta' partijiet terzi, iżda wkoll jagħtik il-ħila li tippubblika malajr u faċilment l-API tiegħek stess.

Biex biex tagħmel dan, l-ewwel trid tippubblikaha fuq xi server fuq in-netwerk. Fil-każ tagħna se nużaw Heroku. Li taħdem magħha m'għandha tikkawża l-ebda diffikultajiet, (tista' ssir taf aktar dwaru hawn).

Kif Tippubblika l-API tiegħek fuq Heroku

1. Installa Heroku.

L-ewwel pass huwa li tirreġistra u tinstalla l-Heroku Command Line Interface (CLI). Dan jaħdem fuq Ubuntu 16+.

sudo snap install heroku —klassiku

Imbagħad idħol:

login heroiku

2. Żid il-fajls meħtieġa.

Issa rridu nżidu fajls biex nippubblikaw f'folder fl-applikazzjoni tagħna:

  • requirements.txt b'lista ta' moduli Python meħtieġa;
  • Procfile, li jispeċifika liema kmandi għandhom jiġu esegwiti biex titmexxa l-applikazzjoni;
  • .gitignore - biex teskludi fajls li mhumiex meħtieġa fuq is-server.

Il-fajl requirements.txt se jkun fih il-linji li ġejjin:

  • garafina
  • flixkun mistrieħ
  • gunicorn

Jekk jogħġbok innota li żidna gunicorn (Python WSGI HTTP Server) mal-lista għaliex għandna bżonn inħaddmu l-applikazzjoni tagħna fuq is-server.

Il-profil se jkun fih:

web: app gunicorn: app

Kontenut ta' .gitignore:

*.pyc
__pycache__/

Issa li l-fajls huma maħluqa, ejja inizjalizzaw il-git repo u nimpenjaw:

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

3. Oħloq applikazzjoni Heroku ġdida.

heroku create

Aħna nimbottaw il-fergħa prinċipali għar-repo remot Heroku:

git push heroku master

Issa tista' tibda billi tiftaħ is-Servizz API billi tuża l-kmandi:

heroku ps:scale web=1
heroku open
 

L-API se tkun disponibbli fuq your-random-heroku-name.herokuapp.com/ai-quotes.

Kif iżżid l-API Python tiegħek fis-suq RapidAPI

Ladarba s-servizz API tiegħek jiġi ppubblikat fuq Heroku, tista 'żżidha mal-API Rapida. Hawn dokumentazzjoni dettaljata fuq dan is-suġġett.

1. Oħloq kont RapidAPI.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Irreġistra kont b'xejn - dan jista 'jsir billi tuża Facebook, Google, GitHub.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

2. Żid l-API mal-pannell tal-kontroll.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

3. Sussegwentement, daħħal informazzjoni ġenerali dwar l-API tiegħek.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

4. Wara li tikklikkja "Żid API" tidher paġna ġdida fejn tista' ddaħħal informazzjoni dwar l-API tagħna.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

5. Issa tista 'jew iddaħħal manwalment l-endpoints tal-API jew tniżżel swagger-fajl bl-użu ta' OpenAPI.

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Ukoll, issa għandna bżonn nissettjaw l-endpoints tal-API tagħna fuq il-paġna Endpoints. Fil-każ tagħna, endpoints jikkorrispondu għall-kunċett ta 'CRUD (get, post, put, delete).

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Sussegwentement, trid toħloq punt ta' tmiem GET AI Quote li juri kwotazzjoni każwali (jekk l-ID hija default) jew kwotazzjoni għall-ID speċifikat.

Biex toħloq endpoint, ikklikkja l-buttuna "Oħloq Endpoint".

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Aħna nirrepetu dan il-proċess għall-endpoints l-oħra kollha tal-API. Dak kollox! Prosit, ippublikajt l-API tiegħek!

Jekk kollox ikun tajjeb, il-paġna tal-API tidher xi ħaġa bħal din:

Kitba ta' API f'Python (bil-Flask u RapidAPI)

Konklużjoni

F'dan l-artikolu, tgħallimna l-proċess tal-ħolqien tas-Servizz API RESTful tiegħek f'Python, flimkien mal-proċess tal-pubblikazzjoni tal-API fis-sħaba Heroku u żżidha mad-direttorju RapidAPI.

Iżda l-verżjoni tat-test wriet biss il-prinċipji bażiċi tal-iżvilupp tal-API - sfumaturi bħas-sigurtà, it-tolleranza tal-ħsarat u l-iskalabbiltà ma ġewx ikkunsidrati.

Meta tiżviluppa API reali, dan kollu jeħtieġ li jitqies.

Sors: www.habr.com

Żid kumment