In API skriuwe yn Python (mei Flask en RapidAPI)

In API skriuwe yn Python (mei Flask en RapidAPI)

As jo ​​​​dit artikel lêze, binne jo wierskynlik al bekend mei de mooglikheden dy't komme mei it brûken fan in API (Application Programming Interface).

Troch ien fan 'e protte iepen API's ta te foegjen oan jo applikaasje, kinne jo de funksjonaliteit fan 'e applikaasje útwreidzje of ferrykje mei de nedige gegevens. Mar wat as jo in unike funksje ûntwikkele hawwe dy't jo wolle diele mei de mienskip?

It antwurd is ienfâldich: jo moatte meitsje jo eigen API.

Hoewol dit earst in lestige taak liket, is it eins ienfâldich. Wy sille jo sjen litte hoe't jo dit dwaan kinne mei Python.

Wat jo nedich hawwe om te begjinnen

Om in API te ûntwikkeljen hawwe jo nedich:

  • Python 3;
  • Flask - in ienfâldich en maklik te brûken ramt foar it meitsjen fan webapplikaasjes;
  • Flask-RUSTfol is in útwreiding foar Flask wêrmei jo in REST API fluch en mei minimale konfiguraasje kinne ûntwikkelje.

Ynstallaasje wurdt útfierd mei it kommando:

pip install flask-restful

Wy riede in fergese yntinsive programmearkursus oan foar begjinners:
Telegram botûntwikkeling yn C# - 26-28 augustus. In fergese yntinsive kursus wêrmei jo kinne begripe hoe't assistint-bots wurkje, de spesifikaasjes fan wurkjen mei de Telegram API en oare nuânses. De trije bêste dielnimmers krije 30 roebel fan Skillbox.

Foardat'st begjinst

Wy sille in RESTful API ûntwikkelje mei basis CRUID funksjonaliteit.

Om de taak folslein te begripen, litte wy de twa hjirboppe neamde termen begripe.

Wat is REST?

REST API (Representational State Transfer) is in API dy't HTTP-fersiken brûkt om gegevens út te wikseljen.

REST API's moatte oan bepaalde kritearia foldwaan:

  • Client-server-arsjitektuer: De kliïnt ynteraksje mei de brûkersynterface, en de server ynteraksje mei de efterkant en gegevensopslach. De client en tsjinner binne ûnôfhinklik, elk fan harren kin wurde ferfongen apart fan de oare.
  • Stateless - gjin klantgegevens wurde opslein op 'e tsjinner. Sesje steat wurdt opslein op de klant kant.
  • Cacheability - Klanten kinne tsjinner-antwurden cache om de algemiene prestaasjes te ferbetterjen.

Wat is CRUD?

RAU is in programmearring konsept dat beskriuwt fjouwer basis aksjes (oanmeitsje, lêze, update en wiskje).

Yn REST API binne oanfraachtypen en oanfraachmetoaden ferantwurdlik foar aksjes lykas post, krije, sette, wiskje.

No't wy de basisbegripen begripe, kinne wy ​​​​begjinne mei it meitsjen fan de API.

Untwikkeling

Litte wy in repository meitsje fan sitaten oer keunstmjittige yntelliginsje. AI is ien fan 'e rapst groeiende technologyen hjoed, en Python is in populêr ark foar wurkjen mei AI.

Mei dizze API kin in Python-ûntwikkelder fluch ynformaasje krije oer AI en ynspireare wurde troch nije foarútgong. As in ûntwikkelder weardefolle gedachten hat oer dit ûnderwerp, sil hy se kinne tafoegje oan it repository.

Litte wy begjinne mei it ymportearjen fan de nedige modules en it ynstellen fan Flask:

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

Yn dit snippet binne Flask, Api en Resource de klassen dy't wy nedich binne.

Reqparse is in Flask-RESTful query parsing ynterface ... Jo sille ek nedich in willekeurige module foar in werjaan in willekeurich sitaat.

No sille wy in repository meitsje fan quotes oer AI.

Elke repo-yngong sil befetsje:

  • digitale ID;
  • namme fan de skriuwer fan it sitaat;
  • quote.

Om't dit gewoan in trainingsfoarbyld is, sille wy alle yngongen opslaan yn in Python-list. Yn in echte applikaasje soene wy ​​​​wierskynlik ynstee in databank brûke.

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

No moatte wy in Quote-boarneklasse meitsje dy't de operaasjes fan ús API-einpunten definiearje sil. Binnen de klasse moatte jo fjouwer metoaden ferklearje: krije, pleatse, pleatse, wiskje.

Litte wy begjinne mei de GET-metoade

It makket it mooglik om in spesifyk quote troch it opjaan fan syn ID, of in willekeurige quote as de ID is net oantsjutte.

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

De metoade GET jout in willekeurige sitaat werom as de ID de standertwearde befettet, d.w.s. gjin ID waard opjûn by it oproppen fan de metoade.

As it is oantsjutte, dan siket de metoade tusken sitaten en fynt dejinge dy't de opjûne ID befettet. As neat fûn wurdt, wurdt it berjocht "Quote not found, 404" werjûn.

Unthâld: de metoade jout in HTTP-status fan 200 as it fersyk suksesfol wie en 404 as it record net fûn is.

Litte wy no in POST-metoade oanmeitsje om in nije quote ta te foegjen oan it repository

It sil de ID krije fan elke nije offerte as jo ynfiere. Derneist sil POST reqparse brûke om de parameters te parsearjen dy't sille gean yn it fersyklichem (auteur en sitaattekst).

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

Yn 'e koade hjirboppe akseptearre de POST-metoade de offerte-ID. Dan, mei reqparse, helle it de auteur en sitaat út 'e query, en bewarre se yn it params-wurdboek.

As in offerte mei de opjûne ID al bestiet, toant de metoade in oerienkommende berjocht en koade 400.

As in sitaat mei de opjûne ID noch net makke is, makket de metoade in nij rekord mei de opjûne ID en auteur, lykas oare parameters. It foeget dan de yngong ta oan 'e ai_quotes-list en jout de yngong werom mei de nije quote tegearre mei in 201-koade.

No meitsje wy in PUT-metoade om in besteande quote yn it repository te feroarjen

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

De PUT-metoade, fergelykber mei it foarige foarbyld, nimt ID en ynfier en parseart de quoteparameters mei reqparse.

As in sitaat mei de oantsjutte ID bestiet, sil de metoade it bywurkje mei de nije parameters en dan de bywurke sitaasje útfiere mei koade 200. As der noch gjin sitaat is mei de oantsjutte ID, sil in nij rekord mei koade 201 oanmakke wurde.

As lêste, litte wy in DELETE-metoade oanmeitsje om in sitaat te ferwiderjen dat net mear ynspirearjend is

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

Dizze metoade krijt de quote-ID as ynfier en fernijt de ai_quotes-list mei de dielde list.

No't wy alle metoaden hawwe makke, moatte wy gewoan in boarne tafoegje oan 'e API, it paad ynstelle en Flask útfiere.

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

Us REST API-tsjinst is klear!

Dêrnei kinne wy ​​de koade opslaan yn it app.py-bestân troch it yn 'e konsole út te fieren mei it kommando:

python3 app.py

As alles goed is, dan krije wy sa'n ding:

* Debug-modus: oan
* Trochgean 127.0.0.1:5000/ (Druk op CTRL+C om te stopjen)
* Op 'e nij begjinne mei stat
* Debugger is aktyf!
* Debugger PIN: XXXXXXX

Testje de API

Sadree't de API is oanmakke, moat it wurde hifke.

Dit kin dien wurde mei it nut fan 'e krulkonsole of de Insomnia REST-client, of troch de API te publisearjen op Rapid API.

In API skriuwe yn Python (mei Flask en RapidAPI)

Publisearje ús API

RapidAPI is de grutste merk yn 'e wrâld mei mear dan 10 API's (en sawat 000 miljoen ûntwikkelders).

RapidAPI biedt net allinich ien ynterface foar wurkjen mei API's fan tredden, mar jout jo ek de mooglikheid om jo eigen API fluch en maklik te publisearjen.

Wetter - Agrarwetter om dit te dwaan, moatte jo it earst publisearje op in tsjinner op it netwurk. Yn ús gefal sille wy brûke Heroku. It wurkjen mei it soe gjin swierrichheden feroarsaakje, (hjir kinne jo mear oer him fine).

Hoe kinne jo jo API op Heroku publisearje

1. Ynstallearje Heroku.

De earste stap is om de Heroku Command Line Interface (CLI) te registrearjen en te ynstallearjen. Dit wurket op Ubuntu 16+.

sudo snap ynstallearje heroku -klassyk

Dan ynlogge:

heroku oanmelde

2. Foegje de nedige triemmen ta.

No moatte wy de te publisearjen bestannen tafoegje oan in map yn ús applikaasje:

  • requirements.txt mei in list fan fereaske Python-modules;
  • Procfile, dat spesifisearret hokker kommando's moatte wurde útfierd om de applikaasje út te fieren;
  • .gitignore - om triemmen út te sluten dy't net nedich binne op de tsjinner.

De requirements.txt-bestân sil de folgjende rigels befetsje:

  • flesse
  • fleske-rêstich
  • gunicorn

Tink derom dat wy gunicorn (Python WSGI HTTP Server) tafoege hawwe oan 'e list, om't wy ús applikaasje op' e tsjinner moatte útfiere.

It profyl sil befetsje:

web: gunicorn app: app

Ynhâld fan .gitignore:

*.pyc
__pycache__/

No't de bestannen binne oanmakke, litte wy de git-repo inisjalisearje en ynsette:

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

3. Meitsje in nije Heroku applikaasje.

heroku create

Wy triuwe de mastertûke nei de ôfstân Heroku-repo:

git push heroku master

No kinne jo begjinne troch de API-tsjinst te iepenjen mei de kommando's:

heroku ps:scale web=1
heroku open
 

De API sil beskikber wêze by dyn-random-heroku-name.herokuapp.com/ai-quotes.

Hoe kinne jo jo Python API tafoegje oan 'e RapidAPI-merk

Sadree't jo API-tsjinst is publisearre op Heroku, kinne jo it tafoegje oan 'e Rapid API. Hjir detaillearre dokumintaasje op dit ûnderwerp.

1. Meitsje in RapidAPI account.

In API skriuwe yn Python (mei Flask en RapidAPI)

Registrearje in fergees akkount - dit kin dien wurde mei Facebook, Google, GitHub.

In API skriuwe yn Python (mei Flask en RapidAPI)

2. Foegje de API ta oan it kontrôlepaniel.

In API skriuwe yn Python (mei Flask en RapidAPI)

3. Folgjende, fier algemiene ynformaasje oer jo API.

In API skriuwe yn Python (mei Flask en RapidAPI)

4. Nei it klikken op "API tafoegje" ferskynt in nije side wêr't jo ynformaasje kinne ynfiere oer ús API.

In API skriuwe yn Python (mei Flask en RapidAPI)

5. No kinne jo de API-einpunten manuell ynfiere of downloade swagger-bestân mei help fan OpenAPI.

In API skriuwe yn Python (mei Flask en RapidAPI)

No, no moatte wy de einpunten fan ús API ynstelle op 'e Endpoints-side. Yn ús gefal oerienkomme einpunten mei it konsept fan CRUD (krije, pleatse, sette, wiskje).

In API skriuwe yn Python (mei Flask en RapidAPI)

Folgjende moatte jo in GET AI Quote-einpunt meitsje dat in willekeurich sitaat werjaan (as de ID standert is) of in offerte foar de opjûne ID.

Om in einpunt te meitsjen, klikje jo op de knop "Einpunt oanmeitsje".

In API skriuwe yn Python (mei Flask en RapidAPI)

Wy werhelje dit proses foar alle oare API-einpunten. Da's alles! Lokwinske, jo hawwe jo API publisearre!

As alles goed is, sil de API-side der sa útsjen:

In API skriuwe yn Python (mei Flask en RapidAPI)

konklúzje

Yn dit artikel learden wy it proses fan it meitsjen fan jo eigen RESTful API-tsjinst yn Python, tegearre mei it proses fan it publisearjen fan de API nei de Heroku-wolk en it tafoegjen oan de RapidAPI-map.

Mar de testferzje toande allinich de basisprinsipes fan API-ûntwikkeling - nuânses lykas feiligens, fouttolerânsje en skalberens waarden net beskôge.

By it ûntwikkeljen fan in echte API moat dit alles yn rekken brocht wurde.

Boarne: www.habr.com

Add a comment