Skribante API en Python (kun Flask kaj RapidAPI)

Skribante API en Python (kun Flask kaj RapidAPI)

Se vi legas ĉi tiun artikolon, vi verŝajne jam konas la eblecojn, kiuj malfermiĝas kiam vi uzas la API (Application Programming Interface).

Aldonante unu el la multaj publikaj API-oj al via aplikaĵo, vi povas etendi la funkciecon de ĉi tiu aplikaĵo aŭ kompletigi ĝin per la necesaj datumoj. Sed kio se vi evoluigis unikan funkcion, kiun vi volas dividi kun la komunumo?

La respondo estas simpla: vi bezonas kreu vian propran API.

Kvankam ĉi tio povas ŝajni kiel timiga tasko komence, ĝi fakte estas sufiĉe simpla. Ni montros al vi kiel fari tion per Python.

Kion vi bezonas por komenci

API-disvolviĝo postulas:

  • Python3;
  • Flasko — simpla kaj facile uzebla kadro por krei TTT-aplikaĵojn;
  • Flakono-RIPOZA estas etendaĵo por Flask, kiu permesas vin disvolvi REST-API rapide kaj kun minimuma agordo.

Instalado estas farita per la komando:

pip install flask-restful

Ni rekomendas senpagan intensan programadon por komencantoj:
Telegram-bot-disvolviĝo en C# — 26–28 aŭgusto. Senpaga intensivo, kiu ebligas al vi kompreni kiel funkcias helpaj robotoj, la funkciojn labori kun la Telegram-API kaj aliaj nuancoj. La plej bonaj tri partoprenantoj ricevos 30 000 rublojn de Skillbox.

Antaŭ ol vi komencos

Ni disvolvos RESTful API kun baza CRUID-funkcio.

Por plene kompreni la taskon, ni komprenu la du terminojn menciitajn supre.

Kio estas REST?

REST API (Reprezenta Ŝtata Translokigo) estas API, kiu uzas HTTP-petojn por interŝanĝi datumojn.

REST-APIoj devas plenumi iujn kriteriojn:

  • Kliento-servila arkitekturo: la kliento interagas kun la uzantinterfaco, kaj la servilo interagas kun la backend kaj datumbutiko. La kliento kaj servilo estas sendependaj, iu el ili povas esti anstataŭigita aparte de la alia.
  • Sennacia - Neniuj klientdatenoj estas stokitaj sur la servilo. La seanca stato estas konservita ĉe la klienta flanko.
  • Cacheability - Klientoj povas konservi servilrespondojn por plibonigi ĝeneralan rendimenton.

Kio estas CRUD?

KRUDA estas programa koncepto kiu priskribas kvar bazajn agojn (krei, legi, ĝisdatigi kaj forigi).

En la REST API, petaj tipoj kaj petaj metodoj respondecas pri agoj kiel afiŝi, akiri, meti, forigi.

Nun kiam ni traktis la bazajn terminojn, ni povas komenci krei la API.

Disvolviĝo

Ni kreu deponejon de citaĵoj pri artefarita inteligenteco. AI estas unu el la plej rapide kreskantaj teknologioj hodiaŭ, kaj Python estas populara ilo por labori kun AI.

Kun ĉi tiu API, Python-programisto povas rapide lerni pri AI kaj esti inspirita de novaj atingoj. Se la programisto havas valorajn pensojn pri ĉi tiu temo, li povos aldoni ilin al la deponejo.

Ni komencu importante la postulatajn modulojn kaj agordi Flask:

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

En ĉi tiu fragmento, Flask, Api kaj Resource estas la klasoj, kiujn ni bezonas.

Reqparse estas Flask-RESTful-peta analiza interfaco... Vi ankaŭ bezonos la hazardan modulon por montri hazardan citaĵon.

Nun ni kreos deponejon de citaĵoj pri AI.

Ĉiu repo-eniro enhavos:

  • cifereca identigilo;
  • la nomo de la aŭtoro de la citaĵo;
  • citaĵo.

Ĉar ĉi tio estas nur lerna ekzemplo, ni stokos ĉiujn enskribojn en Python-listo. En reala aplikaĵo, ni plej verŝajne uzus datumbazon anstataŭe.

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

Nun ni devas krei Quote-rimedan klason, kiu difinos la operaciojn de niaj API-finpunktoj. Kvar metodoj devas esti deklaritaj ene de la klaso: get, post, put, delete.

Ni komencu per la metodo GET

Ĝi permesas vin akiri specifan citaĵon specifante ĝian ID, aŭ hazardan citaĵon se neniu ID estas specifita.

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

La GET-metodo resendas hazardan citaĵon se la ID enhavas la defaŭltan valoron, t.e. dum vokado la metodo ID ne estis agordita.

Se ĝi estas agordita, tiam la metodo serĉas inter citaĵoj kaj trovas tiun, kiu enhavas la donitan ID. Se nenio estas trovita, la mesaĝo "Citaĵo ne trovita, 404" montriĝas.

Memoru, la metodo resendas HTTP-statuson 200 se la peto sukcesis kaj 404 se la eniro ne estis trovita.

Nun ni kreu POST-metodon por aldoni novan citaĵon al la deponejo

Ĝi ricevos la identigilon de ĉiu nova citaĵo dum vi tajpas. Krome, POST uzos reqparse por analizi la parametrojn kiuj iros en la petokorpon (aŭtoro kaj citaĵo 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

En la supra kodo, la POST-metodo akceptis citaĵon ID. Tiam, uzante reqparse, ĝi prenis la aŭtoron kaj citaĵon de la peto, stokante ilin en la params vortaro.

Se citaĵo kun la specifita ID jam ekzistas, tiam la metodo montras la taŭgan mesaĝon kaj kodon 400.

Se citaĵo kun la specifita ID ankoraŭ ne estis kreita, la metodo kreas novan enskribon kun la specifita ID kaj aŭtoro, same kiel aliajn parametrojn. Ĝi tiam aldonas enskribon al la listo de ai_quotes kaj resendas enskribon kun nova citaĵo kune kun 201-kodo.

Nun ni kreas PUT-metodon por ŝanĝi ekzistantan citaĵon en la deponejo

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

La PUT-metodo, simila al la antaŭa ekzemplo, prenas ID kaj enigaĵon kaj analizas la citparametrojn uzante reqparse.

Se ekzistas citaĵo kun la specifita ID, la metodo ĝisdatigos ĝin per la novaj parametroj kaj poste eligos la ĝisdatigitan citaĵon kun kodo 200. Se ankoraŭ ne ekzistas citaĵo kun la specifita ID, nova rekordo kun kodo 201 estos kreita.

Fine, ni kreu DELETE-metodon por forigi citaĵon, kiu ne plu inspiras.

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

Ĉi tiu metodo prenas la citaĵon ID kiel enigo kaj ĝisdatigas la liston de ai_quotes uzante la komunan liston.

Nun kiam ni kreis ĉiujn metodojn, ĉio, kion ni devas fari, estas simple aldoni la rimedon al la API, agordi la vojon kaj ruli Flask.

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

Nia REST API-Servo estas preta!

Poste, ni povas konservi la kodon al la app.py-dosiero rulante ĝin en la konzolo per la komando:

python3 app.py

Se ĉio estas en ordo, tiam ni ricevos ion tian:

* Sencimiga reĝimo: ŝaltita
* Kurante plu 127.0.0.1:5000/ (Premu CTRL+C por ĉesi)
* Rekomencante kun stat
* Erarserĉilo estas aktiva!
* Senĉimilo PIN: XXXXXXX

Testante la API

Post kiam la API estas kreita, ĝi devas esti provita.

Ĉi tio povas esti farita uzante la buklan konzolan ilon aŭ la Insomnia REST-klienton, aŭ publikigante la API sur la Rapida API.

Skribante API en Python (kun Flask kaj RapidAPI)

Eldonante nian API

RapidAPI estas la plej granda vendoplaco en la mondo kun pli ol 10 API-oj (kaj ĉirkaŭ 000 miliono da programistoj).

RapidAPI ne nur provizas ununuran interfacon por labori kun triaj API-oj, sed ankaŭ permesas vin rapide kaj facile publikigi vian propran API.

Por faru tion, vi unue devas publikigi ĝin al iu servilo en la reto. En nia kazo, ni uzos Heroku. Labori kun li ne devus kaŭzi ajnajn malfacilaĵojn, (vi povas ekscii pli pri ĝi ĉi tie).

Kiel publikigi vian API sur Heroku

1. Instalu Heroku.

La unua paŝo estas registri kaj instali la Heroku Command Line Interface (CLI). Ĉi tio funkcias ĉe Ubuntu 16+.

sudo snap install heroku --classic

Tiam ni ensalutu:

Heroku ensaluto

2. Aldonu la necesajn dosierojn.

Nun ni devas aldoni la dosierojn por publikigi al dosierujo en nia aplikaĵo:

  • requirements.txt kun listo de postulataj Python-moduloj;
  • Procfile, kiu specifas kiuj komandoj devas esti ekzekutitaj por ruli la aplikaĵon;
  • .gitignore - por ekskludi dosierojn kiuj ne estas bezonataj en la servilo.

La dosiero requirements.txt enhavos la jenajn liniojn:

  • flakono
  • flak-ripoza
  • gunikorno

Bonvolu noti, ke ni aldonis gunicorn (Python WSGI HTTP Server) al la listo ĉar ni devas ruli nian aplikaĵon sur la servilo.

Profilo enhavos:

retejo: gunicorn app:app

Enhavo de .gitignore:

*.pyc
__pycache__/

Nun kiam la dosieroj estas kreitaj, ni pravigu la git-repozon kaj faru:

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

3. Kreu novan Heroku-aplon.

heroku create

Puŝante la majstran branĉon al la fora Heroku-deponejo:

git push heroku master

Nun vi povas komenci malfermante la API-Servon per la komandoj:

heroku ps:scale web=1
heroku open
 

La API estos disponebla ĉe via-hazarda-heroku-nomo.herokuapp.com/ai-quotes.

Kiel aldoni vian Python API al la RapidAPI-foirejo

Post kiam la API-servo estas publikigita sur Heroku, vi povas aldoni ĝin al la Rapida API. Jen detala dokumentado pri ĉi tiu temo.

1. Kreu RapidAPI-konton.

Skribante API en Python (kun Flask kaj RapidAPI)

Ni registras senpagan konton - tio povas esti farita per Facebook, Google, GitHub.

Skribante API en Python (kun Flask kaj RapidAPI)

2. Aldonu API al la kontrolpanelo.

Skribante API en Python (kun Flask kaj RapidAPI)

3. Poste, enigu ĝeneralajn informojn pri via API.

Skribante API en Python (kun Flask kaj RapidAPI)

4. Post klako "Aldoni API" nova paĝo aperas kie vi povas enigi informojn pri nia API.

Skribante API en Python (kun Flask kaj RapidAPI)

5. Nun vi povas aŭ mane enigi la API-finpunktojn, aŭ elŝuti swagger dosiero uzante OpenAPI.

Skribante API en Python (kun Flask kaj RapidAPI)

Nu, nun vi devas agordi la finpunktojn de nia API sur la Endpoints-paĝo. En nia kazo, la finpunktoj respondas al la koncepto de CRUD (get, post, put, delete).

Skribante API en Python (kun Flask kaj RapidAPI)

Poste, vi devas krei finpunkton GET AI Quote, kiu montras hazardan citaĵon (se la ID estas defaŭlta) aŭ citaĵon por la specifita ID.

Por krei finpunkton, vi devas alklaki la butonon "Krei Finpunkton".

Skribante API en Python (kun Flask kaj RapidAPI)

Ni ripetas ĉi tiun procezon por ĉiuj aliaj API-finpunktoj. Tio estas ĉio! Gratulon, vi publikigis vian API!

Se ĉio iras bone, la API-paĝo aspektos kiel ĉi tio:

Skribante API en Python (kun Flask kaj RapidAPI)

konkludo

En ĉi tiu artikolo, ni trairis la procezon krei nian propran RESTful API-Servon en Python, kune kun la procezo publikigi la API al la Heroku-nubo kaj aldoni ĝin al la dosierujo RapidAPI.

Sed en la testa versio, nur la bazaj principoj de API-disvolviĝo estis montritaj - tiaj nuancoj kiel sekureco, misfunkciado kaj skaleblo ne estis konsiderataj.

Dum disvolvado de reala API, ĉio ĉi devas esti konsiderata.

fonto: www.habr.com

Aldoni komenton