flask api tutorial with example extending flask with apis
Αυτός ο οδηγός Flask API εξηγεί δημοφιλείς επεκτάσεις Flask όπως το Flask twitter Oembedder, το Flask API και το Flask RESTful με παραδείγματα:
Το πλαίσιο Flask έχει αρκετά μεγάλο αριθμό επεκτάσεων. Αυτές οι επεκτάσεις είναι αρκετά χρήσιμες και είναι εύκολο να αναπτυχθούν. Γνωρίζουμε ότι το πλαίσιο Flask είναι πολύ Pythonic και έχει ένα ελάχιστο σύνολο API και είναι πολύ ευέλικτο, γι 'αυτό η κοινότητα του Flask έχει δημιουργήσει τόσες πολλές επεκτάσεις για πολλές συγκεκριμένες εργασίες.
Ως μέρος της σειράς εκμάθησης Flask, αυτός ο οδηγός έχει ένα παράδειγμα μερικών επεκτάσεων Flask. Θα συζητήσουμε τις ακόλουθες επεκτάσεις.
- Flask twitter Oembedder
- API φιάλης
- Φιάλη ΠΕΡΙΣΣΟΤΕΡΑ
=> Επισκεφθείτε εδώ για να μάθετε τη φιάλη από το μηδέν
Αν και έχουμε συζητήσει πολλές επεκτάσεις ως μέρος των προηγούμενων οδηγών μας, αυτό το σεμινάριο εξηγεί περισσότερα με την προοπτική της εξέτασης των στοιχείων μιας επέκτασης Flask.
Τι θα μάθετε:
Τι είναι μια επέκταση φιάλης
Η επέκταση φιάλης είναι μια εγκατεστημένη μονάδα Python ή ένα πακέτο που εφαρμόζει πρόσθετη λειτουργικότητα σε μια εφαρμογή Flask. Μια επέκταση Flask μπορεί να είναι τόσο απλή όσο αυτή που προσθέτει υποστήριξη για την κατανάλωση ενός εξωτερικού API όπως το Twitter για την ενσωμάτωση ενός tweet σε μια ιστοσελίδα.
Εναλλακτικά, μια επέκταση Flask μπορεί να είναι ένα νέο πλαίσιο όπως το Flask API ή το Flask-RESTful για τη δημιουργία εφαρμογών που ακολουθούν ένα αρχιτεκτονικό μοτίβο ή ένα πρότυπο ανάπτυξης.
Flask twitter Oembedder
Σε αυτήν την ενότητα, παίρνουμε το παράδειγμα ενός υπάρχοντος απλού έργου ανοιχτού κώδικα από εδώ
Κλωνοποιήστε αυτό το έργο στο τοπικό μηχάνημά σας και εγκαταστήστε το χρησιμοποιώντας pip με τη βοήθεια της παρακάτω εντολής.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Αυτή η επέκταση βοηθά στην ενσωμάτωση ενός Tweet με τη βοήθεια μιας ετικέτας προτύπου Jinja2. Ωστόσο, για να χρησιμοποιήσετε αυτήν την επέκταση, θα πρέπει να υποβάλετε αίτηση για λογαριασμό προγραμματιστή στο Twitter. Μόλις αποκτήσετε έναν λογαριασμό προγραμματιστή, δημιουργήστε μια εφαρμογή και θα λάβετε κλειδιά και μυστικά για να καταναλώσετε το API του Twitter.
πώς να ανοίξετε ένα .bin
Μόλις έχετε τα κλειδιά και τα μυστικά, αποθηκεύστε τα σε ασφαλές μέρος, έτσι ώστε η εφαρμογή να έχει πρόσβαση σε αυτά. Διατηρήσαμε εκείνες στις μεταβλητές περιβάλλοντος και προσθέσαμε στη διαμόρφωση της εφαρμογής Flask, όπως φαίνεται παρακάτω. Η δοκιμαστική μας εφαρμογή διατηρεί τις τιμές διαμόρφωσης στο αρχείο config.py.
# Twitter details import os TWITTER_ACCESS_TOKEN = os.environ.get('TWITTER_ACCESS_TOKEN', None) TWITTER_TOKEN_SECRET = os.environ.get('TWITTER_TOKEN_SECRET', None) TWITTER_CONSUMER_KEY = os.environ.get('TWITTER_CONSUMER_KEY', None) TWITTER_CONSUMER_SECRET = os.environ.get('TWITTER_CONSUMER_SECRET', None)
Λαμβάνουμε τις τιμές των απαιτούμενων μεταβλητών από τις μεταβλητές περιβάλλοντος. Εάν η αντίστοιχη τιμή δεν υπάρχει στη μεταβλητή περιβάλλοντος, τότε αποθηκεύεται ως Καμία.
Μόλις προσθέσετε τις παραπάνω γραμμές στο αρχείο config, μεταβείτε στην __init__.py της εφαρμογής Flask και αρχικοποιήστε την τροποποιώντας την, όπως φαίνεται παρακάτω.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Αυτές οι γραμμές θα προετοιμάσουν την επέκταση Flask. Τώρα μπορούμε να τροποποιήσουμε το hello.html κάτω από πρότυπα και να προσθέσουμε την παρακάτω ετικέτα όπως φαίνεται παρακάτω.
{{ oembed_tweet('1277228221394587649') }}
Προσθέσαμε αυτήν την ετικέτα πριν από το βρόχο για το υπάρχον πρότυπο. Αυτό το πολύ μεγάλο ψηφίο είναι το αναγνωριστικό tweet. Λαμβάνουμε αυτό το αναγνωριστικό από το Tweet URL μετά το tweet. Μετά την αποθήκευση του αρχείου προτύπου, μεταβαίνουμε στο τελικό σημείο / hello / χαιρετισμούς και λαμβάνουμε τα αποτελέσματα, όπως φαίνεται στην παρακάτω εικόνα.

Φιάλη ΠΕΡΙΣΣΟΤΕΡΑ
Η εφαρμογή Flask RESTful για παράδειγμα είναι αυτή που σέβεται τους περιορισμούς της αρχιτεκτονικής REST. Ωστόσο, δεν είναι σαν ένα πρωτόκολλο και οι προγραμματιστές είναι ευέλικτοι κατά την εφαρμογή των δυνατοτήτων, ακολουθώντας τους περιορισμούς REST.
Διαβάστε περισσότερα σχετικά με τους περιορισμούς της αρχιτεκτονικής REST εδώ .
Οι σύγχρονες διαδικτυακές εφαρμογές επιτρέπουν στους πελάτες να ζητούν τους πόρους σε ευανάγνωστα και σταθερά τελικά σημεία με απάτριδα.
Φιάλη RESTful Παράδειγμα
Ας εφαρμόσουμε μερικές λειτουργίες με τρόπο RESTful και στην εφαρμογή Flask RESTful.
Έχουμε έναν τρόπο αποθήκευσης και εξυπηρέτησης δεδομένων που σχετίζονται με Άλμπουμ και τραγούδια. Ας εφαρμόσουμε ένα API χρησιμοποιώντας την επέκταση Flask RESTful.
Αρχικά, εγκαταστήστε το Flask RESTful χρησιμοποιώντας την παρακάτω εντολή.
pip install flask-restful
Για εύκολη συντήρηση και κατανόηση, ας δημιουργήσουμε ένα αρχείο που ονομάζεται api.py μέσα στον κατάλογο της εφαρμογής και να αναφέρουμε τις ακόλουθες γραμμές κώδικα σε αυτόν. Προς το παρόν, σκεφτείτε API παρόμοια με το Flask Views.
Θα εφαρμόσουμε λειτουργίες που αντιστοιχούν σε ρήματα HTTP για να ανταποκριθούμε όταν ο Πελάτης στέλνει ένα αίτημα στο τελικό σημείο του διακομιστή της εφαρμογής.
from flask import request from flask_restful import Resource, reqparse, abort, Api from . import app api = Api(app, prefix='/myapi/v1') def abort_if_song_doesnt_exist(song_name): if song_name not in SONGS: abort(404, message='Song {} doesn't exist'.format(song_name)) parser = reqparse.RequestParser() parser.add_argument('title') parser.add_argument('singer') SONGS = { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } class Songs(Resource): def get(self): return {'songs': SONGS} def post(self): args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return { song_name:SONGS(song_name) }, 201 api.add_resource(Songs, '/songs') class Song(Resource): def get(self, song_name): abort_if_song_doesnt_exist(song_name) return { song_name: SONGS(song_name) } def delete(self, song_name): abort_if_song_doesnt_exist(song_name) del SONGS(song_name) return '', 204 def put(self, song_name): args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return { song_name: SONGS(song_name) }, 201 api.add_resource(Song, '/songs/')
Έχουμε δημιουργήσει δύο πόρους που ονομάζονται Τραγούδια και Τραγούδι με την υποκατάταξη της αφηρημένης κατηγορίας Πόρων του Flask-RESTful. Η τάξη που ονομάζεται Τραγούδια έχει δύο μεθόδους λήψης και δημοσίευσης που αντιστοιχούν στα δύο ρήματα HTTP. GET και POST, αντίστοιχα.
Ο πόρος τραγούδια εξυπηρετεί όλα τα τραγούδια στο καταχωρισμένο τελικό σημείο όταν ο πελάτης το ζητά και προσθέτει ένα τραγούδι στη λίστα των υπαρχόντων τραγουδιών όταν τα δεδομένα δημοσιεύονται στο ίδιο τελικό σημείο.
Ομοίως, στην περίπτωση της κατηγορίας Song, HTTP GET, DELETE και PUT εφαρμόζονται χρησιμοποιώντας τις μεθόδους get, delete και put. Η μέθοδος get στέλνει μια απάντηση με το ζητούμενο τραγούδι ως JSON, η μέθοδος διαγραφής αφαιρεί ένα τραγούδι από τα SONGS και η μέθοδος put ενημερώνει ένα υπάρχον τραγούδι στα SONGS.
Τώρα ας προσθέσουμε αυτούς τους πόρους στο δείγμα της εφαρμογής μας, αρχικοποιώντας τους σε __init__.py αρχείο κάτω από το φάκελο της εφαρμογής.
πώς είναι το linux καλύτερο από τα παράθυρα
from . import api
Ας εγκαταστήσουμε το curl και δοκιμάστε τις λειτουργίες στα καθορισμένα τελικά σημεία.
sudo apt -y install curl
Λάβετε όλα τα τραγούδια
curl -k https://localhost:8080/api/v1/songs
Λαμβάνουμε την απάντηση, όπως φαίνεται παρακάτω.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Ας χρησιμοποιήσουμε την παρακάτω εντολή για να προσθέσουμε ένα τραγούδι.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Λαμβάνουμε την απάντηση από το API μας, όπως φαίνεται παρακάτω.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Και πάλι, αν ρωτήσουμε τη λίστα τραγουδιών όπως κάναμε στην προηγούμενη εντολή, και θα λάβουμε και τα δύο τραγούδια στην απάντηση.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Ομοίως, το HTTP DELETE και PUT λειτουργούν όπως προορίζεται. Ας προσθέσουμε μερικές δοκιμές για την Έκδοση v1 αυτού του Απλού API που έχουμε δημιουργήσει.
def test_myapi_v1_songs(client): resp = client.get('/api/v1/songs/') #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_myapi_v1_add_song(client): ''' The application can store the same data multiple times''' data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data ) assert 201 == resp.status_code
Τώρα εκτελέστε αυτές τις δοκιμές από τη γραμμή εντολών, όπως φαίνεται παρακάτω.
pytest app/tests/test_api.py
Ομοίως, μπορούμε να γράψουμε δοκιμές για άλλες μεθόδους για περισσότερη κάλυψη.
Ένα σημαντικό πράγμα που πρέπει να σημειωθεί είναι ότι τα τραγούδια που προσθέσαμε εμμένουν ως μέρος της ενιαίας διαδικασίας υπό την οποία εκτελείται ο διακομιστής ανάπτυξης. Αυτό σημαίνει ότι όλα τα νέα δεδομένα θα χαθούν μόλις τερματιστεί η διαδικασία.
Επιπλέον, η εργασία δημιουργίας έκδοσης v1 του API φαίνεται περιττή και διαφέρει από τον τρόπο αποθήκευσης δεδομένων στην εφαρμογή με τη βοήθεια φορμών και προβολών.
Συνήθως, η εφαρμογή RESTful API απαιτεί τη λήψη δεδομένων από τους πελάτες, τη διερεύνηση μεταξύ τελών πελάτη και διακομιστή και επιμονή με τη βοήθεια μοντέλων βάσης δεδομένων που έχουμε δημιουργήσει.
Επιπλέον, τα τελικά σημεία ασφαλίζονται για ακούσιες και κατασκευασμένες εισόδους.
Επομένως, συνιστούμε τα παραπάνω παραδείγματα να είναι μόνο για την εκμάθηση των εννοιών και των περιορισμών της αρχιτεκτονικής REST χρησιμοποιώντας μεθόδους HTTP. Θυμηθείτε ότι αυτός είναι ένας μόνο από τους πολλούς τρόπους δημιουργίας διαδικτυακών υπηρεσιών, γενικά. Επιπλέον, υπάρχουν πολλοί τρόποι με τους οποίους μπορεί να εφαρμοστεί η αρχιτεκτονική REST.
Ενθαρρύνουμε τους αναγνώστες να διερευνήσουν περαιτέρω πώς το REST μπορεί να έχει διαφορετικές μορφές αρχείων και προσαρμοσμένες μεθόδους χρησιμοποιώντας άλλα πρωτόκολλα και όχι μόνο JSON και HTTP. Για να ρίξουμε μια ματιά σε μία χρήση παραγωγής, παρέχουμε το παρακάτω παράδειγμα.
Χρησιμοποιούμε το Flask-Appbuilder BaseApi για να εφαρμόσουμε παρόμοιες λειτουργίες σε διαφορετικά τελικά σημεία. Ανοίξτε το αρχείο api.py και ενημερώστε το με τον παρακάτω κώδικα.
APIs using appbuilder from flask_appbuilder.api import BaseApi, expose from . import appbuilder class SongsApi(BaseApi): resource_name = 'songs' @expose('/', methods=('POST', 'GET')) def songs(self): if request.method == 'GET': return self.response(200, songs=SONGS) else: args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return self.response(201, song=SONGS(song_name)) appbuilder.add_api(SongsApi) class SongApi(BaseApi): resource_name = 'songs' @expose('/', methods=('GET', 'DELETE', 'PUT')) def song(self, song_name): if request.method == 'GET': abort_if_song_doesnt_exist(song_name) return self.response(200, song_name=SONGS(song_name) ) elif request.method == 'DELETE': abort_if_song_doesnt_exist(song_name) del SONGS(song_name) return self.response(204, message='OK') elif request.method == 'PUT': args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return self.response(201, song_name=SONGS(song_name)) else: self.response_404() appbuilder.add_api(SongApi)
Τώρα ας προσθέσουμε μερικές ακόμη δοκιμές για να δοκιμάσουμε τα τελικά σημεία που έχουν δημιουργηθεί χρησιμοποιώντας το Flask-Appbuilder. Θα εκτελέσουμε αυτές τις δοκιμές χρησιμοποιώντας το PyTest.
def test_v1_songs(client): resp = client.get('/api/v1/songs/', follow_redirects=True) #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_v1_add_song(client): ''' The application can store the same data multiple times''' # Get the existing number of songs resp = client.get('/api/v1/songs/', follow_redirects=True) data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data, follow_redirects=True ) assert 201 == resp.status_code
Το Flask-Appbuilder βοηθά επίσης στην παροχή της διεπαφής χρήστη Swagger για λίστα και δοκιμή του δημοσιευμένου API. Ανοίξτε το config.py και ενημερώστε το με τη διαμόρφωση που φαίνεται παρακάτω.
FAB_API_SWAGGER_UI=True
Τώρα μεταβείτε στο https: // localhost: 8080 / swaggerview / v1 και θα μπορείτε να δείτε την προβολή Swagger όπως φαίνεται παρακάτω.

Ας δημιουργήσουμε τώρα API για τα υπάρχοντα μοντέλα βάσεων δεδομένων που διαθέτουμε. Πρέπει να χρησιμοποιήσουμε το ModelApi του Flask-Appbuilder.
Ενημερώστε το αρχείο api.py με τις ακόλουθες γραμμές κώδικα.
from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.api import ModelRestApi from .models import Song as SongModel class MySongModelApi(ModelRestApi): resource_name = 'newsongs' datamodel = SQLAInterface(SongModel) appbuilder.add_api(MySongModelApi)
Αφού ορίσουμε μια κλάση που βασίζεται στο ModelRestApi, πρέπει και πάλι να την καταχωρήσουμε στο Flask-Appbuilder χρησιμοποιώντας τη μέθοδο add_api.
Τώρα πλοηγηθείτε στο Swagger UI όπως νωρίτερα και θα δείτε μια αναφορά API παρόμοια με αυτήν που φαίνεται παρακάτω.

Μπορείτε να δοκιμάσετε το API από την προβολή Swagger ή στέλνοντας την μπούκλα στα τελικά σημεία όπως νωρίτερα.
API φιάλης
Το Flask API είναι ένα πλαίσιο που μοιάζει πολύ με το Django REST. Μπορείτε να αποκτήσετε πρόσβαση στην τεκμηρίωση του Flask API εδώ . Είναι το υποκατάστατο αντικατάστασης του πλαισίου Flask.
Μπορούμε να επιλέξουμε οποιοδήποτε από τα παραπάνω παραδείγματα για να εφαρμόσουμε τις λειτουργίες που βασίζονται στο Flask REST API στην εφαρμογή μας.
Τώρα ας δεσμεύσουμε την πηγή και δημοσιεύστε τις αλλαγές στο repo προέλευσης χρησιμοποιώντας το Git. Μόλις δεσμευτούμε για την προέλευση με το όνομα του υποκαταστήματος και θα στείλουμε ένα αίτημα τραβήγματος, οι δοκιμές μονάδας θα ενεργοποιηθούν αυτόματα κάτω από το Git Actions ως μέρος των ελέγχων αιτήματος έλξης.
RestPlus μπουκαλιών
Το Flask RestPlus είναι μια ακόμη επέκταση Flask που βοηθά στη δημιουργία του REST API χρησιμοποιώντας το Flask. Αυτό το έργο έχει διαμορφωθεί σε μια άλλη επέκταση που ονομάζεται Flask-RESTX και δεν συντηρείται πλέον.
Αυτό το έργο έχει μια καλή συλλογή διακοσμητών για να περιγράψει τα API και εκθέτει την τεκμηρίωσή του χρησιμοποιώντας το Swagger. Μπορείτε να ελέγξετε τις λεπτομέρειες αυτού του έργου εδώ .
Συχνές Ερωτήσεις
Ε # 1) Πώς μπορώ να δημιουργήσω ένα REST API με φιάλη;
Απάντηση: Μπορούμε να χρησιμοποιήσουμε το πλαίσιο Flask με άλλες επεκτάσεις Flask όπως το Flask-RESTful, το Flask API, το Flask RESTX, το Connexion κ.λπ. για να δημιουργήσουμε εφαρμογές διαδικτύου με βάση το REST API. Οι περισσότερες από τις επεκτάσεις λειτουργούν με τις άλλες ενσωματωμένες λειτουργίες του πλαισίου Flask και οποιωνδήποτε άλλων υφιστάμενων ORM / βιβλιοθηκών.
Q # 2) Τι είναι το παράδειγμα REST API;
Απάντηση: Ένα παράδειγμα εφαρμογής που εφαρμόζει το RESTFul API δίνεται σε αυτό το σεμινάριο. Το Flask-RESTful χρησιμοποιήθηκε για τη δημιουργία της εφαρμογής δείγματος. Διαβάστε σχετικά με την ενότητα παραδείγματος Flask RESTful σε αυτό το σεμινάριο.
Q # 3) Σε τι χρησιμεύει το RESTful API;
Απάντηση: Μια διεπαφή προγραμματισμού εφαρμογών που χρησιμοποιεί γενικά αιτήματα HTTP και έχει αντίστοιχες μεθόδους backend για ρήματα HTTP όπως GET, POST, PUT κ.λπ. για να επιτρέψει την επικοινωνία μεταξύ πελάτη και διακομιστή ονομάζεται RESTful API.
καλύτερη εφαρμογή λήψης μουσικής mp3 για Android
Μια τέτοια εφαρμογή ακολουθεί τις αρχές και τους περιορισμούς της αρχιτεκτονικής REST για την εφαρμογή των χαρακτηριστικών της.
συμπέρασμα
Καλύψαμε τις έννοιες των επεκτάσεων Flask με τη βοήθεια τριών επεκτάσεων, όπως το Flask-twitter-oembedder, το Flask API και το Flask-RESTful.
Με τη βοήθεια του Flask-twitter-oembedder, καλύψαμε και τις έννοιες του Twitter API. Σε γενικές γραμμές, έχουμε συμπεριλάβει επίσης τις ιδέες για την εφαρμογή μιας υπηρεσίας διαδικτύου RESTful, που ακολουθεί τις αρχές και τους περιορισμούς της αρχιτεκτονικής REST.
Στο επόμενο σεμινάριό μας, θα καλύψουμε τη σύγκριση μεταξύ Django και Flask framework για να βοηθήσουμε τους αναγνώστες μας να κατανοήσουν τα πλεονεκτήματα και τις αδυναμίες και των δύο πλαισίων. Θα βοηθήσει επίσης στην επιλογή ενός πλαισίου έναντι του άλλου με βάση τις συγκεκριμένες απαιτήσεις του έργου.
=> Εξερευνήστε τη σειρά εκπαιδευτικών απλής φιάλης εδώ
Συνιστώμενη ανάγνωση
- Οδηγός δοκιμών API: Ένας πλήρης οδηγός για αρχάριους
- Rest API API: Αρχιτεκτονική και περιορισμοί API REST
- Parasoft SOAtest Tutorial: Εργαλείο δοκιμών API χωρίς script
- Πώς να δημιουργήσετε τεκμηρίωση API στον Ταχυδρόμο;
- Tutorial GitHub REST API - Υποστήριξη API REST στο GitHub
- Πώς να χρησιμοποιήσετε τον ταχυδρόμο για τη δοκιμή διαφορετικών μορφών API;
- Tutorial POSTMAN: Δοκιμή API χρησιμοποιώντας το POSTMAN
- Κορυφαίες 31 δημοφιλείς ερωτήσεις συνέντευξης Python Flask με απαντήσεις