Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Εάν διαβάζετε αυτό το άρθρο, πιθανότατα είστε ήδη εξοικειωμένοι με τις δυνατότητες που ανοίγονται όταν χρησιμοποιείτε το API (Application Programming Interface).

Προσθέτοντας ένα από τα πολλά δημόσια API στην εφαρμογή σας, μπορείτε να επεκτείνετε τη λειτουργικότητα αυτής της εφαρμογής ή να τη συμπληρώσετε με τα απαραίτητα δεδομένα. Τι γίνεται όμως αν έχετε αναπτύξει μια μοναδική δυνατότητα που θέλετε να μοιραστείτε με την κοινότητα;

Η απάντηση είναι απλή: χρειάζεστε δημιουργήστε το δικό σας API.

Αν και αυτό μπορεί να φαίνεται σαν ένα τρομακτικό έργο στην αρχή, είναι στην πραγματικότητα αρκετά απλό. Θα σας δείξουμε πώς να το κάνετε αυτό με την Python.

Τι χρειάζεστε για να ξεκινήσετε

Η ανάπτυξη API απαιτεί:

  • Python3;
  • Φιάλη — ένα απλό και εύχρηστο πλαίσιο για τη δημιουργία διαδικτυακών εφαρμογών.
  • Φιάλη-Ξεκουρασμένος είναι μια επέκταση για το Flask που σας επιτρέπει να αναπτύξετε ένα REST API γρήγορα και με ελάχιστη διαμόρφωση.

Η εγκατάσταση πραγματοποιείται με την εντολή:

pip install flask-restful

Συνιστούμε έναν δωρεάν εντατικό προγραμματισμό για αρχάριους:
Ανάπτυξη bot Telegram σε C# — 26–28 Αυγούστου. Ένα δωρεάν εντατικό που σας επιτρέπει να κατανοήσετε πώς λειτουργούν τα βοηθητικά ρομπότ, τις δυνατότητες εργασίας με το API του Telegram και άλλες αποχρώσεις. Οι τρεις πρώτοι συμμετέχοντες θα λάβουν 30 ρούβλια από το Skillbox.

Πριν ξεκινήσεις

Θα αναπτύξουμε ένα RESTful API με ένα βασικό Λειτουργία CRUID.

Για να κατανοήσουμε πλήρως την εργασία, ας κατανοήσουμε τους δύο όρους που αναφέρθηκαν παραπάνω.

Τι είναι το REST;

Το REST API (Representational State Transfer) είναι ένα API που χρησιμοποιεί αιτήματα HTTP για την ανταλλαγή δεδομένων.

Τα REST API πρέπει να πληρούν ορισμένα κριτήρια:

  • Αρχιτεκτονική πελάτη-διακομιστή: ο πελάτης αλληλεπιδρά με τη διεπαφή χρήστη και ο διακομιστής αλληλεπιδρά με το backend και το χώρο αποθήκευσης δεδομένων. Ο πελάτης και ο διακομιστής είναι ανεξάρτητοι, οποιοδήποτε από αυτά μπορεί να αντικατασταθεί ξεχωριστά από το άλλο.
  • Χωρίς ιθαγένεια - Δεν αποθηκεύονται δεδομένα πελάτη στον διακομιστή. Η κατάσταση περιόδου λειτουργίας αποθηκεύεται στην πλευρά του πελάτη.
  • Δυνατότητα αποθήκευσης στην κρυφή μνήμη - Οι πελάτες μπορούν να αποθηκεύουν τις απαντήσεις διακομιστή για να βελτιώσουν τη συνολική απόδοση.

Τι είναι το CRUD;

ΘΕΡΜΟΣ είναι μια έννοια προγραμματισμού που περιγράφει τέσσερις βασικές ενέργειες (δημιουργία, ανάγνωση, ενημέρωση και διαγραφή).

Στο REST API, οι τύποι αιτημάτων και οι μέθοδοι αιτημάτων είναι υπεύθυνες για ενέργειες όπως ανάρτηση, λήψη, τοποθέτηση, διαγραφή.

Τώρα που ασχοληθήκαμε με τους βασικούς όρους, μπορούμε να ξεκινήσουμε τη δημιουργία του API.

Ανάπτυξη

Ας δημιουργήσουμε ένα αποθετήριο αποσπασμάτων για την τεχνητή νοημοσύνη. Η τεχνητή νοημοσύνη είναι μια από τις ταχύτερα αναπτυσσόμενες τεχνολογίες σήμερα και η Python είναι ένα δημοφιλές εργαλείο για την εργασία με τεχνητή νοημοσύνη.

Με αυτό το API, ένας προγραμματιστής Python μπορεί να μάθει γρήγορα για την τεχνητή νοημοσύνη και να εμπνευστεί από νέα επιτεύγματα. Εάν ο προγραμματιστής έχει πολύτιμες σκέψεις για αυτό το θέμα, θα μπορεί να τις προσθέσει στο αποθετήριο.

Ας ξεκινήσουμε εισάγοντας τις απαιτούμενες μονάδες και ρυθμίζοντας το Flask:

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

Σε αυτό το απόσπασμα, το Flask, το Api και το Resource είναι οι κλάσεις που χρειαζόμαστε.

Το Reqparse είναι μια διεπαφή ανάλυσης αιτημάτων Flask-RESTful... Θα χρειαστείτε επίσης το τυχαίο module για να εμφανίσετε ένα τυχαίο απόσπασμα.

Τώρα θα δημιουργήσουμε ένα αποθετήριο εισαγωγικών για την τεχνητή νοημοσύνη.

Κάθε καταχώρηση repo θα περιέχει:

  • Ψηφιακή ταυτότητα?
  • το όνομα του συγγραφέα του αποσπάσματος·
  • παραθέτω, αναφορά.

Επειδή αυτό είναι απλώς ένα παράδειγμα εκμάθησης, θα αποθηκεύσουμε όλες τις καταχωρήσεις σε μια λίστα Python. Σε μια πραγματική εφαρμογή, πιθανότατα θα χρησιμοποιούσαμε μια βάση δεδομένων.

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

Τώρα πρέπει να δημιουργήσουμε μια κλάση πόρων Quote που θα ορίζει τις λειτουργίες των τελικών σημείων API μας. Τέσσερις μέθοδοι πρέπει να δηλωθούν μέσα στην κλάση: get, post, put, delete.

Ας ξεκινήσουμε με τη μέθοδο GET

Σας επιτρέπει να λάβετε μια συγκεκριμένη προσφορά προσδιορίζοντας το αναγνωριστικό της ή μια τυχαία προσφορά εάν δεν έχει καθοριστεί αναγνωριστικό.

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

Η μέθοδος GET επιστρέφει ένα τυχαίο εισαγωγικό εάν το αναγνωριστικό περιέχει την προεπιλεγμένη τιμή, π.χ. κατά την κλήση το αναγνωριστικό της μεθόδου δεν ορίστηκε.

Εάν έχει οριστεί, τότε η μέθοδος αναζητά ανάμεσα σε εισαγωγικά και βρίσκει αυτό που περιέχει το δεδομένο αναγνωριστικό. Εάν δεν βρεθεί τίποτα, εμφανίζεται το μήνυμα "Η προσφορά δεν βρέθηκε, 404".

Θυμηθείτε, η μέθοδος επιστρέφει μια κατάσταση HTTP 200 εάν το αίτημα ήταν επιτυχές και 404 εάν η καταχώρηση δεν βρέθηκε.

Τώρα ας δημιουργήσουμε μια μέθοδο POST για να προσθέσουμε μια νέα προσφορά στο αποθετήριο

Θα λαμβάνει το αναγνωριστικό κάθε νέας προσφοράς καθώς πληκτρολογείτε. Επιπλέον, το POST θα χρησιμοποιήσει το reqparse για να αναλύσει τις παραμέτρους που θα μπουν στο σώμα του αιτήματος (συγγραφέας και κείμενο αναφοράς).

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

Στον παραπάνω κώδικα, η μέθοδος POST αποδέχτηκε ένα αναγνωριστικό προσφοράς. Στη συνέχεια, χρησιμοποιώντας το reqparse, πήρε τον συγγραφέα και το απόσπασμα από το αίτημα, αποθηκεύοντάς τα στο λεξικό παραμέτρων.

Εάν υπάρχει ήδη μια προσφορά με το καθορισμένο αναγνωριστικό, τότε η μέθοδος εμφανίζει το κατάλληλο μήνυμα και τον κωδικό 400.

Εάν δεν έχει δημιουργηθεί ακόμη μια προσφορά με το καθορισμένο αναγνωριστικό, η μέθοδος δημιουργεί μια νέα καταχώρηση με το καθορισμένο αναγνωριστικό και τον συγγραφέα, καθώς και άλλες παραμέτρους. Στη συνέχεια, προσθέτει μια καταχώρηση στη λίστα ai_quotes και επιστρέφει μια καταχώρηση με μια νέα προσφορά μαζί με έναν κωδικό 201.

Τώρα δημιουργούμε μια μέθοδο PUT για να αλλάξουμε μια υπάρχουσα προσφορά στο αποθετήριο

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

Η μέθοδος PUT, παρόμοια με το προηγούμενο παράδειγμα, λαμβάνει ένα αναγνωριστικό και μια είσοδο και αναλύει τις παραμέτρους του quote χρησιμοποιώντας reqparse.

Εάν υπάρχει μια προσφορά με το καθορισμένο αναγνωριστικό, η μέθοδος θα την ενημερώσει με τις νέες παραμέτρους και στη συνέχεια θα παράγει την ενημερωμένη προσφορά με τον κωδικό 200. Εάν δεν υπάρχει ακόμη προσφορά με το καθορισμένο αναγνωριστικό, θα δημιουργηθεί μια νέα εγγραφή με κωδικό 201.

Τέλος, ας δημιουργήσουμε μια μέθοδο DELETE για να αφαιρέσουμε ένα απόσπασμα που δεν είναι πλέον εμπνευσμένο.

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

Αυτή η μέθοδος λαμβάνει το αναγνωριστικό προσφοράς ως είσοδο και ενημερώνει τη λίστα των ai_quotes χρησιμοποιώντας την κοινόχρηστη λίστα.

Τώρα που δημιουργήσαμε όλες τις μεθόδους, το μόνο που χρειάζεται να κάνουμε είναι απλώς να προσθέσουμε τον πόρο στο API, να ορίσουμε τη διαδρομή και να εκτελέσουμε το Flask.

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

Η υπηρεσία REST API είναι έτοιμη!

Στη συνέχεια, μπορούμε να αποθηκεύσουμε τον κώδικα στο αρχείο app.py εκτελώντας τον στην κονσόλα με την εντολή:

python3 app.py

Αν όλα είναι καλά, τότε θα πάρουμε κάτι σαν αυτό:

* Λειτουργία εντοπισμού σφαλμάτων: ενεργό
* Τρέξιμο 127.0.0.1:5000/ (Πατήστε CTRL+C για έξοδο)
* Επανεκκίνηση με stat
* Ο εντοπισμός σφαλμάτων είναι ενεργός!
* PIN εντοπισμού σφαλμάτων: XXXXXXX

Δοκιμή του API

Αφού δημιουργηθεί το API, πρέπει να δοκιμαστεί.

Αυτό μπορεί να γίνει χρησιμοποιώντας το βοηθητικό πρόγραμμα κονσόλας curl ή το πρόγραμμα-πελάτη Insomnia REST ή δημοσιεύοντας το API στο Rapid API.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Δημοσίευση του API μας

Το RapidAPI είναι η μεγαλύτερη αγορά στον κόσμο με πάνω από 10 API (και περίπου 000 εκατομμύριο προγραμματιστές).

Το RapidAPI όχι μόνο παρέχει μια ενιαία διεπαφή για εργασία με API τρίτων, αλλά σας επιτρέπει επίσης να δημοσιεύετε γρήγορα και εύκολα το δικό σας API.

Να Κάνε το, πρέπει πρώτα να το δημοσιεύσετε σε κάποιον διακομιστή του δικτύου. Στην περίπτωσή μας, θα χρησιμοποιήσουμε Heroku. Η συνεργασία μαζί του δεν πρέπει να προκαλεί δυσκολίες, (μπορείτε να μάθετε περισσότερα για αυτό εδώ).

Πώς να δημοσιεύσετε το API σας στο Heroku

1. Εγκαταστήστε το Heroku.

Το πρώτο βήμα είναι η εγγραφή και η εγκατάσταση της διεπαφής γραμμής εντολών Heroku (CLI). Αυτό λειτουργεί στο Ubuntu 16+.

sudo snap εγκατάσταση heroku --classic

Στη συνέχεια συνδέουμε:

σύνδεση heroku

2. Προσθέστε τα απαραίτητα αρχεία.

Τώρα πρέπει να προσθέσουμε τα αρχεία προς δημοσίευση σε έναν φάκελο στην εφαρμογή μας:

  • απαιτήσεις.txt με μια λίστα απαιτούμενων λειτουργικών μονάδων Python.
  • Προφίλ, το οποίο καθορίζει ποιες εντολές πρέπει να εκτελεστούν για την εκτέλεση της εφαρμογής.
  • .gitignore - για εξαίρεση αρχείων που δεν χρειάζονται στον διακομιστή.

Το αρχείο requirements.txt θα περιέχει τις ακόλουθες γραμμές:

  • φλάσκα
  • φιάλη-αναπαυτική
  • οπλίτης

Λάβετε υπόψη ότι έχουμε προσθέσει τον Gunicorn (Python WSGI HTTP Server) στη λίστα επειδή πρέπει να εκτελέσουμε την εφαρμογή μας στον διακομιστή.

Το προφίλ θα περιέχει:

web: app gunicorn: app

Περιεχόμενο του .gitignore:

*.pyc
__pycache__/

Τώρα που δημιουργήθηκαν τα αρχεία, ας αρχικοποιήσουμε το git repo και ας δεσμευτούμε:

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

3. Δημιουργήστε μια νέα εφαρμογή Heroku.

heroku create

Ωθώντας τον κύριο κλάδο στο απομακρυσμένο αποθετήριο Heroku:

git push heroku master

Τώρα μπορείτε να ξεκινήσετε ανοίγοντας την Υπηρεσία API με τις εντολές:

heroku ps:scale web=1
heroku open
 

Το API θα είναι διαθέσιμο στη διεύθυνση your-random-heroku-name.herokuapp.com/ai-quotes.

Πώς να προσθέσετε το Python API σας στην αγορά RapidAPI

Μόλις δημοσιευτεί η υπηρεσία API στο Heroku, μπορείτε να την προσθέσετε στο Rapid API. Εδώ αναλυτική τεκμηρίωση πανω σε αυτο το θεμα.

1. Δημιουργήστε έναν λογαριασμό RapidAPI.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Δηλώνουμε δωρεάν λογαριασμό - αυτό μπορεί να γίνει χρησιμοποιώντας το Facebook, το Google, το GitHub.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

2. Προσθέστε το API στον πίνακα ελέγχου.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

3. Στη συνέχεια, εισαγάγετε γενικές πληροφορίες σχετικά με το API σας.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

4. Αφού κάνετε κλικ στο «Προσθήκη API» εμφανίζεται μια νέα σελίδα όπου μπορείτε να εισαγάγετε πληροφορίες σχετικά με το API μας.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

5. Τώρα μπορείτε είτε να εισαγάγετε μη αυτόματα τα τελικά σημεία του API είτε να κάνετε λήψη αρχείο swagger χρησιμοποιώντας το OpenAPI.

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Λοιπόν, τώρα πρέπει να ορίσετε τα τελικά σημεία του API μας στη σελίδα Endpoints. Στην περίπτωσή μας, τα τελικά σημεία αντιστοιχούν στην έννοια του CRUD (get, post, put, delete).

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Στη συνέχεια, πρέπει να δημιουργήσετε ένα τελικό σημείο GET AI Quote που εμφανίζει μια τυχαία προσφορά (εάν το αναγνωριστικό είναι προεπιλεγμένο) ή μια προσφορά για το καθορισμένο αναγνωριστικό.

Για να δημιουργήσετε ένα τελικό σημείο, πρέπει να κάνετε κλικ στο κουμπί "Δημιουργία τελικού σημείου".

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Επαναλαμβάνουμε αυτή τη διαδικασία για όλα τα άλλα τελικά σημεία API. Αυτό είναι όλο! Συγχαρητήρια, δημοσιεύσατε το API σας!

Εάν όλα πάνε καλά, η σελίδα API θα μοιάζει κάπως έτσι:

Γράψιμο ενός API σε Python (με Flask και RapidAPI)

Συμπέρασμα

Σε αυτό το άρθρο, ακολουθήσαμε τη διαδικασία δημιουργίας της δικής μας υπηρεσίας RESTful API στην Python, μαζί με τη διαδικασία δημοσίευσης του API στο σύννεφο Heroku και προσθήκης του στον κατάλογο RapidAPI.

Αλλά στη δοκιμαστική έκδοση, εμφανίστηκαν μόνο οι βασικές αρχές της ανάπτυξης API - δεν ελήφθησαν υπόψη αποχρώσεις όπως η ασφάλεια, η ανοχή σφαλμάτων και η επεκτασιμότητα.

Κατά την ανάπτυξη ενός πραγματικού API, όλα αυτά πρέπει να λαμβάνονται υπόψη.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο