flask api tutorial with example extending flask with apis
Bu Flask API Eğitimi, Flask twitter Oembedder, Flask API ve Flask RESTful gibi popüler Flask uzantılarını örneklerle açıklamaktadır:
Flask çerçevesi oldukça fazla sayıda uzantıya sahiptir. Bu uzantılar oldukça kullanışlıdır ve geliştirilmeleri kolaydır. Flask çerçevesinin çok Pythonic olduğunu ve minimum API setine sahip olduğunu ve çok esnek olduğunu biliyoruz, bu nedenle Flask topluluğu birçok özel görev için bu kadar çok uzantı oluşturmuştur.
Flask eğitim serisinin bir parçası olarak, bu eğitimde birkaç Flask uzantısı örneği bulunmaktadır. Aşağıdaki uzantıları tartışacağız.
- Cep şişesi twitter Oembedder
- Flask API
- Flask RESTful
=> Sıfırdan Şişeyi Öğrenmek İçin Burayı Ziyaret Edin
Önceki eğitimlerimizin bir parçası olarak birçok uzantıyı tartışmış olsak da, Bu eğitici, bir Flask uzantısının bileşenlerini inceleme perspektifiyle daha fazlasını açıklamaktadır.
Ne öğreneceksin:
Flask Uzantısı Nedir
Bir şişe uzantısı, yüklenebilir bir Python modülü veya bir Flask uygulamasına ek işlevsellik uygulayan bir pakettir. Bir Flask uzantısı, bir web sayfasına bir tweet eklemek için Twitter gibi harici bir API kullanma desteğini ekleyen uzantı kadar basit olabilir.
Veya bir Flask uzantısı, bir mimari modeli veya bir geliştirme paradigmasını takip eden uygulamalar oluşturmak için Flask API veya Flask-RESTful gibi yeni bir çerçeve olabilir.
Cep şişesi twitter Oembedder
Bu bölümde, mevcut bir açık kaynaklı basit proje örneğini alıyoruz. İşte
Bu projeyi yerel makinenizde klonlayın ve aşağıda belirtilen komut yardımı ile pip kullanarak kurun.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Bu uzantı, Jinja2 şablon etiketi yardımıyla Tweet yerleştirmeye yardımcı olur. Ancak bu uzantıyı kullanmak için Twitter'da bir geliştirici hesabına başvurmanız gerekecek. Bir geliştirici hesabı edindiğinizde, bir Uygulama oluşturun ve Twitter'ın API'sini kullanmak için anahtarlar ve sırlar alacaksınız.
yazılım testinde hata türleri
Anahtarlara ve sırlara sahip olduğunuzda, uygulamanın bunlara erişebilmesi için bunları güvenli bir yerde saklayın. Bunları ortam değişkenlerinde tuttuk ve aşağıda gösterildiği gibi Flask uygulama yapılandırmasına ekledik. Demo uygulamamız, yapılandırma değerlerini config.py dosyasında tutar.
# 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)
Gerekli değişkenlerin değerlerini ortam değişkenlerinden alıyoruz. Karşılık gelen değer ortam değişkeninde yoksa, bu Yok olarak saklanır.
Yukarıdaki satırları yapılandırma dosyasına ekledikten sonra, Flask uygulamasının __init__.py sayfasına gidin ve aşağıda gösterildiği gibi değiştirerek başlatın.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Bu çizgiler Flask uzantısını başlatacak. Şimdi hello.html'yi şablonlar altında değiştirebilir ve aşağıda belirtilen etiketi aşağıda gösterildiği gibi ekleyebiliriz.
{{ oembed_tweet('1277228221394587649') }}
Bu etiketi mevcut şablonda for döngüsünün önüne ekledik. Bu çok uzun rakam tweet kimliğidir. Bu kimliği tweetledikten sonra Tweet URL'sinden alıyoruz. Şablon dosyasını kaydettikten sonra, aşağıdaki resimde gösterildiği gibi / hello / greetings uç noktasına gidiyoruz ve sonuçları alıyoruz.
Flask RESTful
Flask RESTful örnek uygulamamız, REST mimarisinin kısıtlamalarına saygı duyan bir uygulamadır. Ancak, bir protokol gibi değildir ve geliştiriciler, REST kısıtlamalarını izleyerek özellikleri uygularken esnektir.
Lütfen REST mimarisinin kısıtlamaları hakkında daha fazla bilgi edinin İşte .
Modern web uygulamaları, istemcilerin kaynakları kolay okunur ve kararlı uç noktalarda durum bilgisiz bir şekilde talep etmelerine olanak tanır.
Flask RESTful Örnek
Flask RESTful örnek uygulamamızda da bazı özellikleri RESTful bir şekilde uygulayalım.
Albümler ve Şarkılar ile ilgili verileri saklama ve sunma yöntemimiz var. Flask RESTful uzantısını kullanarak bir API uygulayalım.
İlk önce aşağıdaki komutu kullanarak Flask RESTful'u kurun.
pip install flask-restful
Kolay bakım ve anlayış için, uygulama dizini içinde api.py adlı bir dosya oluşturalım ve içinde aşağıdaki kod satırlarından bahsedelim. Şimdilik, Flask Görünümlerine benzer API'leri düşünün.
İstemci uygulamanın Sunucu uç noktasına bir istek gönderdiğinde yanıt vermek için HTTP fiillerine karşılık gelen özellikleri uygulayacağız.
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'un Kaynak soyut sınıfını alt sınıflandırarak Şarkılar ve Şarkı adlı iki kaynak oluşturduk. Şarkılar adı verilen Sınıfın iki HTTP fiiline karşılık gelen alma ve gönderme yöntemi vardır; Sırasıyla GET ve POST.
Şarkılar kaynağı, İstemci istediğinde tüm şarkıları kayıtlı uç noktaya sunar ve veriler aynı uç noktada yayınlandığında mevcut şarkılar listesine bir şarkı ekler.
Benzer şekilde Song sınıfı durumunda, HTTP GET, DELETE ve PUT get, delete ve put yöntemleri kullanılarak uygulanır. Yöntem get, JSON olarak istenen şarkıyla bir yanıt gönderir, yöntem silme, SONGS'den bir şarkıyı kaldırır ve koyma yöntemi, SONGS'taki mevcut bir şarkıyı günceller.
Şimdi bu kaynakları uygulama klasörünün altındaki __init__.py dosyasında başlatarak örnek uygulamamıza ekleyelim.
from . import api
Curl'yi yükleyelim ve belirtilen uç noktalardaki özellikleri deneyelim.
sudo apt -y install curl
Tüm şarkıları al
curl -k https://localhost:8080/api/v1/songs
Yanıtı aşağıda gösterildiği gibi alıyoruz.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Şimdi bir şarkı eklemek için aşağıda belirtilen komutu kullanalım.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Yanıtı aşağıda gösterildiği gibi API'mizden alıyoruz.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Şimdi yine, önceki komutta yaptığımız gibi şarkıların listesini sorgularsak ve yanıtta her iki şarkıyı da alacağız.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Benzer şekilde, HTTP DELETE ve PUT amaçlandığı gibi çalışır. Oluşturduğumuz bu Basit API'nin Sürüm v1'i için birkaç test ekleyelim.
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
Şimdi bu testleri aşağıda gösterildiği gibi komut satırından çalıştırın.
pytest app/tests/test_api.py
Benzer şekilde, daha fazla kapsam için diğer yöntemler için testler yazabiliriz.
Unutulmaması gereken önemli bir nokta, eklediğimiz şarkıların, geliştirme sunucusunun çalıştığı tek sürecin bir parçası olarak kalmasıdır. Bu, işlem kapanır kapanmaz tüm yeni verilerin kaybolacağı anlamına gelir.
Dahası, API'nin v1 sürümünü oluşturma görevi gereksiz görünüyor ve bu, formlar ve görünümler yardımıyla uygulamada veri kaydetme yöntemimizden farklı.
b-ağacı ve b + ağacı
Genellikle, RESTful API uygulaması, istemcilerden veri almayı, İstemci ve sunucu uçları arasında sıralamayı ve oluşturduğumuz veritabanı modellerinin yardımıyla sürekliliği gerektirir.
Dahası, uç noktalar istenmeyen ve hazırlanmış girdiler için güvence altına alınmıştır.
Bu nedenle, yukarıda verilen örneklerin yalnızca REST mimarisinin kavramlarını ve kısıtlamalarını HTTP yöntemlerini kullanarak öğrenmek için olmasını öneririz. Lütfen bunun, genel olarak oluşturulmuş birçok web hizmetinden yalnızca biri olduğunu unutmayın. Dahası, REST mimarisinin uygulanabileceği birçok yol vardır.
Okuyucuları, yalnızca JSON ve HTTP'yi değil, diğer protokolleri kullanarak REST'in nasıl farklı dosya biçimlerine ve özel yöntemlere sahip olabileceğini daha fazla keşfetmeye teşvik ediyoruz. Sadece bir üretim kullanımına bir göz atmak için aşağıdaki örneği veriyoruz.
Farklı uç noktalar altında benzer özellikleri uygulamak için bir Flask-Appbuilder BaseApi kullanıyoruz. Api.py dosyasını açın ve aşağıda belirtilen kodla güncelleyin.
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)
Şimdi, Flask-Appbuilder kullanılarak oluşturulan uç noktaları test etmek için birkaç test daha ekleyelim. Bu testleri PyTest kullanarak çalıştıracağız.
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, yayınlanan API'yi listelemek ve denemek için Swagger kullanıcı arayüzünün sağlanmasına da yardımcı olur. Config.py'yi açın ve aşağıda gösterilen yapılandırmayla güncelleyin.
FAB_API_SWAGGER_UI=True
Şimdi https: // localhost: 8080 / swaggerview / v1'e gidin ve Swagger görünümünü aşağıda gösterildiği gibi görebileceksiniz.
Şimdi sahip olduğumuz mevcut veritabanı modelleri için API'ler oluşturalım. Flask-Appbuilder'ın ModelApi'sini kullanmamız gerekiyor.
Api.py dosyasını aşağıdaki kod satırlarıyla güncelleyin.
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'ye dayalı bir sınıf tanımladıktan sonra, add_api yöntemini kullanarak onu Flask-Appbuilder ile yeniden kaydetmemiz gerekir.
Şimdi daha önce olduğu gibi Swagger UI'ye gidin ve aşağıda gösterilene benzer bir API referansı göreceksiniz.
API'yi Swagger görünümünden veya curl'yi daha önce olduğu gibi uç noktalara göndererek deneyebilirsiniz.
Flask API
Flask API, Django REST çerçevesine oldukça benzer bir çerçevedir. Flask API belgelerine erişebilirsiniz İşte . Flask çerçevesinin yerine geçmeli.
Uygulamamızda Flask REST API güdümlü özellikleri uygulamak için yukarıda verilen örneklerden herhangi birini seçebiliriz.
Şimdi kaynağı teslim edelim ve değişiklikleri orijinal depoda Git kullanarak yayınlayalım. Dal adıyla orijine taahhüt ettiğimiz ve bir çekme isteği gönderdiğimiz anda, birim testleri, çekme isteği kontrollerinin bir parçası olarak Git Eylemleri altında otomatik olarak tetiklenecektir.
Flask RestPlus
Flask RestPlus, Flask kullanılarak REST API'nin oluşturulmasına yardımcı olan bir başka Flask uzantısıdır. Bu proje, Flask-RESTX adlı başka bir uzantıya bölünmüştür ve artık sürdürülmemektedir.
Bu proje, API'leri tanımlamak için iyi bir dekoratör koleksiyonuna sahiptir ve Swagger'ı kullanarak belgelerini ortaya çıkarır. Bu projenin detaylarını kontrol edebilirsiniz İşte .
Sıkça Sorulan Sorular
S # 1) Flask ile nasıl bir REST API oluşturabilirim?
Cevap: REST API tabanlı web uygulamaları oluşturmak için Flask çerçevesini Flask-RESTful, Flask API, Flask RESTX, Connexion gibi diğer Flask uzantılarıyla birlikte kullanabiliriz. Uzantıların çoğu, Flask çerçevesinin diğer yerleşik özellikleriyle ve diğer mevcut ORM / kitaplıklarla çalışır.
S # 2) REST API örneği nedir?
Cevap: Bu öğreticide RESTFul API uygulayan bir örnek uygulama verilmiştir. Örnek uygulamayı oluşturmak için Flask-RESTful kullanılmıştır. Bu eğiticide Flask RESTful örnek bölümü hakkında bilgi edinin.
S # 3) RESTful API ne içindir?
Cevap: Genel olarak HTTP isteklerini kullanan ve İstemci ile Sunucu arasında iletişime izin vermek için GET, POST, PUT vb. Gibi HTTP fiilleri için karşılık gelen arka uç yöntemlerine sahip bir Uygulama Programlama Arayüzüne RESTful API adı verilir.
web uygulamaları için açık kaynak otomasyon test araçları
Böyle bir uygulama, özelliklerini uygulamak için REST mimarisi ilkelerini ve kısıtlamalarını takip eder.
Sonuç
Flask-twitter-oembedder, Flask API ve Flask-RESTful gibi üç uzantının yardımıyla Flask uzantılarının kavramlarını ele aldık.
Flask-twitter-oembedder'ın yardımıyla Twitter API kavramlarını da ele aldık. Genel olarak, REST mimarisi ilkelerini ve kısıtlamalarını izleyen bir RESTful web hizmeti uygulama fikirlerini de dahil ettik.
Bir sonraki eğitimimizde, okuyucularımızın her iki çerçevenin güçlü ve zayıf yönlerini anlamalarına yardımcı olmak için Django ve Flask çerçevesi arasındaki karşılaştırmayı ele alacağız. Ayrıca, belirli proje gereksinimlerine dayalı olarak bir çerçeveyi diğerine karşı seçmede yardımcı olacaktır.
=> Basit Şişe Eğitim Serisini Buradan Keşfedin
Önerilen Kaynaklar
- API Test Eğitimi: Yeni Başlayanlar İçin Tam Bir Kılavuz
- Rest API Eğiticisi: REST API Mimarisi ve Kısıtlamaları
- Parasoft SOAtest Eğitimi: Komut Dosyasız API Test Aracı
- Postacıda API Belgeleri Nasıl Oluşturulur?
- GitHub REST API Eğitimi - GitHub'da REST API Desteği
- Postman, Farklı API Formatlarını Test Etmek İçin Nasıl Kullanılır?
- POSTMAN Eğitimi: POSTMAN Kullanarak API Testi
- En Popüler 31 Python Flask Mülakat Sorusu ve Cevapları