Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Os ydych chi'n darllen yr erthygl hon, mae'n debyg eich bod eisoes yn gyfarwydd â'r posibiliadau sy'n agor wrth ddefnyddio'r API (Rhyngwyneb Rhaglennu Cymhwysiad).

Trwy ychwanegu un o'r nifer o APIs cyhoeddus at eich cais, gallwch ymestyn ymarferoldeb y cymhwysiad hwn neu ychwanegu ato gyda'r data angenrheidiol. Ond beth os ydych chi wedi datblygu nodwedd unigryw rydych chi am ei rhannu gyda'r gymuned?

Mae'r ateb yn syml: mae angen ichi creu eich API eich hun.

Er y gall hyn ymddangos yn dasg frawychus ar y dechrau, mae'n eithaf syml mewn gwirionedd. Byddwn yn dangos i chi sut i wneud hyn gyda Python.

Beth sydd ei angen arnoch i ddechrau

Mae datblygiad API yn gofyn am:

  • Python3;
  • Fflasg — fframwaith syml a hawdd ei ddefnyddio ar gyfer creu cymwysiadau gwe;
  • Fflasg-RESTful yn estyniad ar gyfer Fflasg sy'n eich galluogi i ddatblygu API REST yn gyflym a chyda'r cyfluniad lleiaf posibl.

Perfformir y gosodiad gan y gorchymyn:

pip install flask-restful

Rydym yn argymell rhaglennu dwys am ddim i ddechreuwyr:
Datblygiad Telegram bot yn C# —Awst 26-28. Dwys am ddim sy'n eich galluogi i ddeall sut mae bots cynorthwy-ydd yn gweithio, nodweddion gweithio gyda'r API Telegram a naws eraill. Bydd y tri phrif gyfranogwr yn derbyn 30 rubles o Skillbox.

Cyn i chi ddechrau

Rydyn ni'n mynd i ddatblygu API RESTful gyda sylfaenol ymarferoldeb CRUID.

I ddeall y dasg yn llawn, gadewch i ni ddeall y ddau derm a grybwyllir uchod.

Beth yw REST?

Mae REST API (Representational State Transfer) yn API sy'n defnyddio ceisiadau HTTP i gyfnewid data.

Rhaid i APIs REST fodloni meini prawf penodol:

  • Pensaernïaeth cleient-gweinydd: mae'r cleient yn rhyngweithio â'r rhyngwyneb defnyddiwr, ac mae'r gweinydd yn rhyngweithio â'r backend a'r storfa ddata. Mae'r cleient a'r gweinydd yn annibynnol, gellir disodli unrhyw un ohonynt ar wahân i'r llall.
  • Di-wladwriaeth - Nid oes unrhyw ddata cleient yn cael ei storio ar y gweinydd. Mae cyflwr y sesiwn yn cael ei storio ar ochr y cleient.
  • Cacheability - Gall cleientiaid storio ymatebion gweinyddwyr i wella perfformiad cyffredinol.

Beth yw CRUD?

RAW yn gysyniad rhaglennu sy'n disgrifio pedwar gweithred sylfaenol (creu, darllen, diweddaru a dileu).

Yn yr API REST, mae mathau o geisiadau a dulliau cais yn gyfrifol am weithredoedd fel postio, cael, rhoi, dileu.

Nawr ein bod wedi delio â'r termau sylfaenol, gallwn ddechrau creu'r API.

Datblygiad

Gadewch i ni greu ystorfa o ddyfyniadau am ddeallusrwydd artiffisial. AI yw un o'r technolegau sy'n tyfu gyflymaf heddiw, ac mae Python yn arf poblogaidd ar gyfer gweithio gydag AI.

Gyda'r API hwn, gall datblygwr Python ddysgu'n gyflym am AI a chael ei ysbrydoli gan gyflawniadau newydd. Os oes gan y datblygwr feddyliau gwerthfawr ar y pwnc hwn, bydd yn gallu eu hychwanegu at y storfa.

Gadewch i ni ddechrau trwy fewnforio'r modiwlau gofynnol a gosod Fflasg:

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

Yn y pyt hwn, Fflasg, Api ac Adnodd yw'r dosbarthiadau sydd eu hangen arnom.

Mae Reqparse yn rhyngwyneb dosrannu cais Fflasg-RESTful... Bydd angen y modiwl ar hap hefyd i ddangos dyfynbris ar hap.

Nawr byddwn yn creu ystorfa o ddyfyniadau am AI.

Bydd pob cofnod repo yn cynnwys:

  • ID digidol;
  • enw awdur y dyfyniad;
  • dyfyniad.

Gan mai enghraifft ddysgu yn unig yw hon, byddwn yn storio pob cofnod mewn rhestr Python. Mewn cymhwysiad go iawn, mae'n debyg y byddem yn defnyddio cronfa ddata yn lle hynny.

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

Nawr mae angen i ni greu dosbarth adnoddau Dyfynbris a fydd yn diffinio gweithrediadau ein pwyntiau terfyn API. Rhaid datgan pedwar dull y tu mewn i'r dosbarth: cael, postio, rhoi, dileu.

Gadewch i ni ddechrau gyda'r dull GET

Mae'n caniatáu ichi gael dyfynbris penodol trwy nodi ei ID, neu ddyfynbris ar hap os na nodir 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

Mae'r dull GET yn dychwelyd dyfynbris ar hap os yw'r ID yn cynnwys y gwerth rhagosodedig, h.y. Ni osodwyd ID wrth ffonio'r dull.

Os yw wedi'i osod, yna mae'r dull yn chwilio ymhlith dyfynbrisiau ac yn dod o hyd i'r un sy'n cynnwys yr ID a roddwyd. Os na chanfyddir unrhyw beth, dangosir y neges “Ni chanfuwyd dyfynbris, 404”.

Cofiwch, mae'r dull yn dychwelyd statws HTTP o 200 os oedd y cais yn llwyddiannus a 404 os na ddaethpwyd o hyd i'r cofnod.

Nawr, gadewch i ni greu dull POST i ychwanegu dyfynbris newydd i'r ystorfa

Bydd yn cael id pob dyfynbris newydd wrth i chi deipio. Yn ogystal, bydd POST yn defnyddio reqparse i ddosrannu'r paramedrau a fydd yn mynd yn y corff cais (awdur a dyfyniad testun).

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 y cod uchod, derbyniodd y dull POST ID dyfynbris. Yna, gan ddefnyddio reqparse, adalwodd yr awdur a dyfyniad o'r cais, gan eu storio yn y geiriadur params.

Os oes dyfynbris gyda'r ID penodedig eisoes yn bodoli, yna mae'r dull yn dangos y neges a'r cod 400 priodol.

Os nad yw dyfynbris gyda'r ID penodedig wedi'i greu eto, mae'r dull yn creu cofnod newydd gyda'r ID a'r awdur penodedig, yn ogystal â pharamedrau eraill. Yna mae'n ychwanegu cofnod at y rhestr ai_quotes ac yn dychwelyd cofnod gyda dyfynbris newydd ynghyd â chod 201.

Nawr rydym yn creu dull PUT i newid dyfynbris sy'n bodoli eisoes yn yr ystorfa

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

Mae'r dull PUT, sy'n debyg i'r enghraifft flaenorol, yn cymryd ID a mewnbwn ac yn dosrannu'r paramedrau dyfynbris gan ddefnyddio reqparse.

Os oes dyfynbris gyda'r ID penodedig yn bodoli, bydd y dull yn ei ddiweddaru gyda'r paramedrau newydd ac yna'n allbwn y dyfynbris wedi'i ddiweddaru gyda chod 200. Os nad oes dyfynbris gyda'r ID penodedig eto, bydd cofnod newydd gyda chod 201 yn cael ei greu.

Yn olaf, gadewch i ni greu dull DELETE i gael gwared ar ddyfynbris nad yw bellach yn ysbrydoledig.

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

Mae'r dull hwn yn cymryd yr ID dyfynbris fel mewnbwn ac yn diweddaru'r rhestr o ai_quotes gan ddefnyddio'r rhestr a rennir.

Nawr ein bod ni wedi creu'r holl ddulliau, y cyfan sydd angen i ni ei wneud yw ychwanegu'r adnodd i'r API, gosod y llwybr, a rhedeg Fflasg.

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

Mae ein Gwasanaeth API REST yn barod!

Nesaf, gallwn arbed y cod i'r ffeil app.py trwy ei redeg yn y consol gyda'r gorchymyn:

python3 app.py

Os yw popeth yn iawn, yna fe gawn ni rywbeth fel hyn:

* Modd dadfygio: ymlaen
* Yn rhedeg ymlaen 127.0.0.1: 5000/ (Pwyswch CTRL+C i roi'r gorau iddi)
* Ailgychwyn gyda stat
* Mae dadfygiwr yn weithredol!
* PIN dadfygiwr: XXXXXXX

Profi'r API

Ar ôl i'r API gael ei greu, mae angen ei brofi.

Gellir gwneud hyn gan ddefnyddio'r cyfleustodau consol curl neu'r cleient Insomnia REST, neu drwy gyhoeddi'r API ar yr API Cyflym.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Cyhoeddi ein API

RapidAPI yw'r farchnad fwyaf yn y byd gyda dros 10 o APIs (a thua 000 miliwn o ddatblygwyr).

Mae RapidAPI nid yn unig yn darparu un rhyngwyneb ar gyfer gweithio gydag APIs trydydd parti, ond mae hefyd yn caniatáu ichi gyhoeddi eich API eich hun yn gyflym ac yn hawdd.

I ei wneud, yn gyntaf mae angen i chi ei gyhoeddi i ryw weinydd ar y rhwydwaith. Yn ein hachos ni, byddwn yn defnyddio Heroku. Ni ddylai gweithio gydag ef achosi unrhyw anawsterau, (gallwch ddarganfod mwy amdano yma).

Sut i gyhoeddi eich API ar Heroku

1. Gosod Heroku.

Y cam cyntaf yw cofrestru a gosod Rhyngwyneb Llinell Reoli Heroku (CLI). Mae hyn yn gweithio ar Ubuntu 16+.

sudo snap install heroku --classic

Yna rydym yn mewngofnodi:

mewngofnodi heroku

2. Ychwanegwch y ffeiliau angenrheidiol.

Nawr mae angen i ni ychwanegu'r ffeiliau i'w cyhoeddi i ffolder yn ein cais:

  • requirements.txt gyda rhestr o fodiwlau Python gofynnol;
  • Procfile, sy'n nodi pa orchmynion y mae'n rhaid eu gweithredu i redeg y rhaglen;
  • .gitnore - i eithrio ffeiliau nad oes eu hangen ar y gweinydd.

Bydd y ffeil requirements.txt yn cynnwys y llinellau canlynol:

  • fflasg
  • llonydd-fflach
  • gwnicorn

Sylwch ein bod wedi ychwanegu gunicorn (Gweinydd HTTP Python WSGI) at y rhestr oherwydd mae angen i ni redeg ein cais ar y gweinydd.

Bydd y proffil yn cynnwys:

gwe: gunicorn app:app

Cynnwys .gitnore:

*.pyc
__pycache__/

Nawr bod y ffeiliau wedi'u creu, gadewch i ni gychwyn y repo git ac ymrwymo:

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

3. Creu app Heroku newydd.

heroku create

Gwthio'r brif gangen i repo Heroku anghysbell:

git push heroku master

Nawr gallwch chi ddechrau trwy agor y Gwasanaeth API gyda'r gorchmynion:

heroku ps:scale web=1
heroku open
 

Bydd yr API ar gael yn your-random-heroku-name.herokuapp.com/ai-quotes.

Sut i ychwanegu eich API Python i'r farchnad RapidAPI

Unwaith y bydd y gwasanaeth API wedi'i gyhoeddi ar Heroku, gallwch ei ychwanegu at yr API Cyflym. Yma dogfennaeth fanwl ar y pwnc hwn.

1. Creu cyfrif RapidAPI.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Rydym yn cofrestru cyfrif am ddim - gellir gwneud hyn gan ddefnyddio Facebook, Google, GitHub.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

2. Ychwanegu API i'r panel rheoli.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

3. Nesaf, rhowch wybodaeth gyffredinol am eich API.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

4. Ar ôl clicio "Ychwanegu API" mae tudalen newydd yn ymddangos lle gallwch chi nodi gwybodaeth am ein API.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

5. Nawr gallwch naill ai â llaw fynd i mewn i'r endpoints API, neu lawrlwytho ffeil swagger gan ddefnyddio OpenAPI.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Wel, nawr mae angen i chi osod pwyntiau terfyn ein API ar y dudalen Endpoints. Yn ein hachos ni, mae'r pwyntiau terfyn yn cyfateb i'r cysyniad o CRUD (cael, postio, rhoi, dileu).

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Nesaf, mae angen i chi greu diweddbwynt GET AI Quote sy'n dangos dyfynbris ar hap (os yw'r ID yn ddiofyn) neu ddyfynbris ar gyfer yr ID penodedig.

I greu pwynt terfyn, mae angen i chi glicio ar y botwm “Creu Endpoint”.

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Rydym yn ailadrodd y broses hon ar gyfer pob pwynt terfyn API arall. Dyna i gyd! Llongyfarchiadau, rydych chi wedi cyhoeddi eich API!

Os aiff popeth yn iawn, bydd y dudalen API yn edrych rhywbeth fel hyn:

Ysgrifennu API yn Python (gyda Flask a RapidAPI)

Casgliad

Yn yr erthygl hon, cerddom trwy'r broses o greu ein Gwasanaeth API RESTful ein hunain yn Python, ynghyd â'r broses o gyhoeddi'r API i'r cwmwl Heroku a'i ychwanegu at gyfeiriadur RapidAPI.

Ond yn y fersiwn prawf, dim ond egwyddorion sylfaenol datblygu API a ddangoswyd - ni ystyriwyd arlliwiau fel diogelwch, goddefgarwch namau a scalability.

Wrth ddatblygu API go iawn, rhaid ystyried hyn i gyd.

Ffynhonnell: hab.com

Ychwanegu sylw