Google'ın Cloud SQL ve App Engine'i Flask Kullanarak API Kurma
Yayınlanan: 2022-03-10API'ler oluşturmak için, ikisi Flask ve Django olmak üzere birkaç Python çerçevesi kullanılabilir. Çerçeveler, geliştiricilerin, kullanıcıların uygulamalarıyla etkileşim kurmak için ihtiyaç duyduğu özellikleri uygulamasını kolaylaştıran işlevsellik ile birlikte gelir. Bir web uygulamasının karmaşıklığı, hangi çerçeveyle çalışacağınızı seçerken belirleyici bir faktör olabilir.
Django
Django, yerleşik işlevselliğe sahip önceden tanımlanmış bir yapıya sahip sağlam bir çerçevedir. Ancak sağlamlığının dezavantajı, çerçeveyi belirli projeler için çok karmaşık hale getirebilmesidir. Django'nun gelişmiş işlevlerinden yararlanmaya ihtiyaç duyan karmaşık web uygulamaları için en uygunudur.
şişe
Flask ise API'ler oluşturmak için hafif bir çerçevedir. Başlamak kolaydır ve ilerledikçe sağlam hale getirmek için paketler mevcuttur. Bu makale, görünüm işlevlerini ve denetleyiciyi tanımlamaya ve Google Cloud'daki bir veritabanına bağlanmaya ve Google Cloud'a dağıtmaya odaklanacaktır.
Öğrenmek amacıyla, en sevdiğimiz şarkılardan oluşan bir koleksiyonu yönetmek için birkaç uç nokta içeren bir Flask API oluşturacağız. Uç noktalar, GET
ve POST
istekleri için olacaktır: kaynakları alma ve oluşturma. Bunun yanı sıra, Google Cloud platformundaki hizmet paketini kullanacağız. Veritabanımız için Google'ın Cloud SQL'ini ayarlayacağız ve App Engine'e dağıtarak uygulamamızı başlatacağız. Bu eğitici, uygulamaları için Google Cloud'u kullanmaya başlayan yeni başlayanlara yöneliktir.
Bir Flask Projesi Kurma
Bu öğretici, Python 3.x'in kurulu olduğunu varsayar. Bunu yapmazsanız, indirmek ve kurmak için resmi web sitesine gidin.
Python'un kurulu olup olmadığını kontrol etmek için komut satırı arabiriminizi (CLI) başlatın ve aşağıdaki komutu çalıştırın:
python -V
İlk adımımız projemizin yaşayacağı dizini oluşturmak. Biz buna flask-app
diyeceğiz:
mkdir flask-app && cd flask-app
Python projesine başlarken yapılacak ilk şey sanal bir ortam oluşturmaktır. Sanal ortamlar, çalışan Python geliştirmenizi izole eder. Bu, bu projenin makinelerinizdeki diğer projelerden farklı olarak kendi bağımlılıklarına sahip olabileceği anlamına gelir. venv, Python 3 ile birlikte gelen bir modüldür.
flask-app
dizinimizde sanal bir ortam oluşturalım:
python3 -m venv env
Bu komut, dizinimizde bir env
klasörü oluşturur. Ad (bu durumda env
) sanal ortam için bir takma addır ve herhangi bir adla adlandırılabilir.
Artık sanal ortamı oluşturduğumuza göre projemize onu kullanmasını söylemeliyiz. Sanal ortamımızı etkinleştirmek için aşağıdaki komutu kullanın:
source env/bin/activate
CLI isteminizin başında artık ortamımızın etkin olduğunu gösteren env
olduğunu göreceksiniz.

(env)
komut isteminden önce görünür (Büyük önizleme)Şimdi Flask paketimizi kuralım:
pip install flask
Mevcut dizinimizde api
adında bir dizin oluşturun. Bu dizini, uygulamamızın diğer klasörlerinin bulunacağı bir klasörümüz olması için oluşturuyoruz.
mkdir api && cd api
Ardından, uygulamamıza giriş noktası görevi görecek bir main.py
dosyası oluşturun:
touch main.py
main.py
açın ve aşağıdaki kodu girin:
#main.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello World' if __name__ == '__main__': app.run()
Burada ne yaptığımızı anlayalım. Önce Flask paketinden Flask
sınıfını import ettik. Ardından sınıfın bir örneğini oluşturduk ve onu app
. Ardından, uygulamamızın kökünü gösteren ilk uç noktamızı oluşturduk. Özetle, bu /
route'u çağıran bir görünüm işlevidir - Hello World
döndürür.
Uygulamayı çalıştıralım:
python main.py
Bu, yerel sunucumuzu başlatır ve https://127.0.0.1:5000/
uygulamamızı sunar. URL'yi tarayıcınıza girin ve ekranınızda yazdırılan Hello World
yanıtını göreceksiniz.
Ve işte! Uygulamamız çalışıyor ve çalışıyor. Bir sonraki görev, onu işlevsel hale getirmektir.
Uç noktalarımızı çağırmak için geliştiricilerin uç noktaları test etmesine yardımcı olan bir hizmet olan Postman'ı kullanacağız. Resmi web sitesinden indirebilirsiniz.
main.py
bazı verileri döndürmesini sağlayalım:
#main.py from flask import Flask, jsonify app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) if __name__ == '__main__': app.run()
Burada, şarkının adı ve sanatçının adı da dahil olmak üzere şarkıların bir listesini ekledik. Daha sonra kök /
rotayı /songs
olarak değiştirdik. Bu rota, belirttiğimiz şarkı dizisini döndürür. Listemizi JSON değeri olarak alabilmek için listeyi jsonify üzerinden geçirerek jsonify
. Artık basit bir Hello world
görmek yerine https://127.0.0.1:5000/songs
uç noktasına eriştiğimizde sanatçıların bir listesini görüyoruz.

get
yanıt alma (Büyük önizleme) Her değişiklikten sonra sunucumuzu yeniden başlatmamız gerektiğini fark etmişsinizdir. Kod değiştiğinde otomatik yeniden yüklemeyi etkinleştirmek için hata ayıklama seçeneğini etkinleştirelim. Bunu yapmak için app.run
şekilde değiştirin:
app.run(debug=True)
Ardından dizimize post request kullanarak bir şarkı ekleyelim. İlk olarak, kullanıcılarımızdan gelen talebi işleyebilmemiz için request
nesnesini içe aktarın. Daha sonra JSON'da kullanıcının girdisini almak için request
nesnesini görünüm işlevinde kullanacağız.
#main.py from flask import Flask, jsonify, request app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) @app.route('/songs', methods=['POST']) def add_songs(): song = request.get_json() songs.append(song) return jsonify(songs) if __name__ == '__main__': app.run(debug=True)
add_songs
görüntüleme işlevimiz, kullanıcı tarafından gönderilen bir şarkıyı alır ve onu mevcut şarkı listemize ekler.

Şimdiye kadar verilerimizi bir Python listesinden döndürdük. Bu sadece deneyseldir, çünkü daha sağlam bir ortamda sunucuyu yeniden başlatırsak yeni eklenen verilerimiz kaybolacaktır. Bu mümkün değil, bu yüzden verileri depolamak ve almak için canlı bir veritabanına ihtiyacımız olacak. Cloud SQL geliyor.
Neden Bulut SQL Örneği Kullanmalısınız?
Resmi web sitesine göre:
“Google Cloud SQL, bulutta ilişkisel MySQL ve PostgreSQL veritabanlarınızı kurmayı, korumayı, yönetmeyi ve yönetmeyi kolaylaştıran, tam olarak yönetilen bir veritabanı hizmetidir. Google Cloud Platform'da barındırılan Cloud SQL, her yerde çalışan uygulamalar için bir veritabanı altyapısı sağlıyor."
Bu, bir veritabanının altyapısının yönetimini esnek bir fiyatla tamamen Google'a yaptırabileceğimiz anlamına gelir.
Cloud SQL ile Kendi Kendini Yöneten Bilgi İşlem Motoru Arasındaki Fark
Google Cloud'da, Google'ın Compute Engine altyapısında sanal bir makine çalıştırabilir ve SQL örneğimizi yükleyebiliriz. Bu, dikey ölçeklenebilirlik, çoğaltma ve bir dizi başka yapılandırmadan sorumlu olacağımız anlamına gelir. Cloud SQL ile birçok yapılandırmayı kullanıma hazır hale getiriyoruz, böylece kod üzerinde daha fazla ve kurulum için daha az zaman harcayabiliyoruz.
Başlamadan Önce:
- Google Cloud'a kaydolun. Google, yeni kullanıcılara 300 ABD doları tutarında ücretsiz kredi sunar.
- Bir proje oluşturun. Bu oldukça basittir ve doğrudan konsoldan yapılabilir.
Bir Bulut SQL Örneği Oluşturun
Google Cloud'a kaydolduktan sonra sol panelde “SQL” sekmesine gidin ve tıklayın.


İlk önce bir SQL motoru seçmemiz gerekiyor. Bu makale için MySQL ile gideceğiz.

Ardından, bir örnek oluşturacağız. Varsayılan olarak, örneğimiz ABD'de oluşturulacak ve bölge bizim için otomatik olarak seçilecektir.
Kök parolasını ayarlayın ve örneğe bir ad verin ve ardından “Oluştur” düğmesine tıklayın. "Yapılandırma seçeneklerini göster" açılır menüsünü tıklayarak örneği daha da yapılandırabilirsiniz. Ayarlar, örneğin boyutunu, depolama kapasitesini, güvenliğini, kullanılabilirliğini, yedeklerini ve daha fazlasını yapılandırmanıza olanak tanır. Bu makale için varsayılan ayarlarla gideceğiz. Endişelenmeyin, bu değişkenler daha sonra değiştirilebilir.
İşlemin tamamlanması birkaç dakika sürebilir. Yeşil bir onay işareti gördüğünüzde örneğin hazır olduğunu bileceksiniz. Ayrıntılar sayfasına gitmek için örneğinizin adına tıklayın.
Şimdi, çalışmaya başladığımıza göre, birkaç şey yapacağız:
- Bir veritabanı oluşturun.
- Yeni bir kullanıcı oluşturun.
- IP adresimizi beyaz listeye alın.
Veritabanı Oluştur
Bir veritabanı oluşturmak için "Veritabanı" sekmesine gidin.

Yeni Bir Kullanıcı Oluştur

"Ana bilgisayar adı" bölümünde, "% (herhangi bir ana bilgisayar)"a izin verecek şekilde ayarlayın.

Beyaz Liste IP Adresi
Veritabanı örneğinize iki yoldan biriyle bağlanabilirsiniz. Özel bir IP adresi, bir sanal özel bulut (VPC) gerektirir. Bu seçeneği seçerseniz Google Cloud, Google tarafından yönetilen bir VPC oluşturacak ve örneğinizi buna yerleştirecektir. Bu yazı için varsayılan olan genel IP adresini kullanacağız. Yalnızca IP adresleri beyaz listeye alınmış kişilerin veritabanına erişebileceği anlamında herkese açıktır.
IP adresinizi beyaz listeye almak için, IP'nizi almak için bir Google aramasına my ip
yazın. Ardından, "Bağlantılar" sekmesine ve "Ağ Ekle"ye gidin.

Örneğe Bağlan
Ardından, "Genel Bakış" paneline gidin ve bulut kabuğunu kullanarak bağlanın.

Cloud SQL örneğimize bağlanma komutu konsolda önceden yazılacaktır.
Kök kullanıcıyı veya daha önce oluşturulmuş kullanıcıyı kullanabilirsiniz. Aşağıdaki komutta şunu söylüyoruz: flask-demo
örneğine USERNAME
kullanıcısı olarak bağlanın. Kullanıcının şifresini girmeniz istenecektir.
gcloud sql connect flask-demo --user=USERNAME
Proje kimliğiniz olmadığını söyleyen bir hata alırsanız, şunu çalıştırarak projenizin kimliğini alabilirsiniz:
gcloud projects list
Yukarıdaki komuttan çıkarılan proje kimliğini alın ve PROJECT_ID
ile değiştirerek aşağıdaki komuta girin.
gcloud config set project PROJECT_ID
Ardından gcloud sql connect
komutunu çalıştırın, bağlanacağız.
Aktif veritabanlarını görmek için bu komutu çalıştırın:
> show databases;

Veritabanımın adı db_demo
ve db_demo
veritabanını kullanmak için aşağıdaki komutu çalıştıracağım. information_schema
ve performance_schema
gibi bazı diğer veritabanlarını görebilirsiniz. Bunlar, tablo meta verilerini depolamak için vardır.
> use db_demo;
Ardından, Flask uygulamamızdan listeyi yansıtan bir tablo oluşturun. Aşağıdaki kodu bir not defterine yazın ve bulut kabuğunuza yapıştırın:
create table songs( song_id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255), artist VARCHAR(255), genre VARCHAR(255), PRIMARY KEY(song_id) );
Bu kod, dört sütunlu ( song_id
, title
, artist
ve genre
) songs
adlı bir tablo oluşturan bir SQL komutudur. Ayrıca tablonun song_id
birincil anahtar olarak tanımlaması ve 1'den itibaren otomatik olarak artırması talimatını verdik.
Şimdi show tables;
Tablonun oluşturulduğunu onaylamak için

Ve aynen böyle bir veri tabanı ve songs
tablomuzu oluşturduk.
Bir sonraki görevimiz, uygulamamızı dağıtabilmemiz için Google App Engine'i kurmak.
Google Uygulama Motoru
App Engine, geniş ölçekte web uygulamaları geliştirmek ve barındırmak için tam olarak yönetilen bir platformdur. App Engine'e dağıtmanın bir avantajı, bir uygulamanın gelen trafiği karşılamak için otomatik olarak ölçeklenmesini sağlamasıdır.
App Engine web sitesinde şöyle yazıyor:
"Sıfır sunucu yönetimi ve sıfır yapılandırma dağıtımları ile geliştiriciler, yönetim yükü olmadan yalnızca harika uygulamalar oluşturmaya odaklanabilir."
App Engine'i Kur
App Engine'i kurmanın birkaç yolu vardır: Google Cloud Console'un kullanıcı arayüzü veya Google Cloud SDK aracılığıyla. Bu bölüm için SDK kullanacağız. Google Cloud örneğimizi yerel makinemizden dağıtmamıza, yönetmemize ve izlememize olanak tanır.
Google Cloud SDK'yı yükleyin
Mac veya Windows için SDK'yı indirmek ve kurmak için talimatları izleyin. Kılavuz ayrıca CLI'nizde SDK'yı nasıl başlatacağınızı ve bir Google Cloud projesini nasıl seçeceğinizi gösterecektir.
SDK yüklendiğine göre, Python komut dosyamızı veritabanımızın kimlik bilgileriyle güncelleyeceğiz ve App Engine'e dağıtacağız.
Yerel Kurulum
Yerel ortamımızda, kurulumu Cloud SQL ve App Engine'i içeren yeni mimarimize uyacak şekilde güncelleyeceğiz.
Öncelikle kök klasörümüze bir app.yaml
dosyası ekleyin. Bu, App Engine'in uygulamamızı barındırması ve çalıştırması için ihtiyaç duyduğu bir yapılandırma dosyasıdır. App Engine'e çalışma zamanımızı ve gerekli olabilecek diğer değişkenleri bildirir. Uygulamamız için, App Engine'in veritabanımızın örneğinden haberdar olması için veritabanımızın kimlik bilgilerini ortam değişkenleri olarak eklememiz gerekecek.
app.yaml
dosyasında aşağıdaki parçacığı ekleyin. Veritabanını kurarken çalışma zamanı ve veritabanı değişkenlerini almış olacaksınız. Değerleri, Cloud SQL'i kurarken kullandığınız kullanıcı adı, şifre, veritabanı adı ve bağlantı adıyla değiştirin.
#app.yaml runtime: python37 env_variables: CLOUD_SQL_USERNAME: YOUR-DB-USERNAME CLOUD_SQL_PASSWORD: YOUR-DB-PASSWORD CLOUD_SQL_DATABASE_NAME: YOUR-DB-NAME CLOUD_SQL_CONNECTION_NAME: YOUR-CONN-NAME
Şimdi PyMySQL kurulumu yapacağız. Bu, bir MySQL veritabanına bağlanan ve sorgular gerçekleştiren bir Python MySQL paketidir. CLI'nizde bu satırı çalıştırarak PyMySQL paketini kurun:
pip install pymysql
Bu noktada, uygulamadan Cloud SQL veritabanımıza bağlanmak için PyMySQL kullanmaya hazırız. Bu, veritabanımıza sorguları almamızı ve eklememizi sağlayacaktır.
Veritabanı Bağlayıcısını Başlat
Öncelikle kök klasörümüzde bir db.py
dosyası oluşturun ve aşağıdaki kodu ekleyin:
#db.py import os import pymysql from flask import jsonify db_user = os.environ.get('CLOUD_SQL_USERNAME') db_password = os.environ.get('CLOUD_SQL_PASSWORD') db_name = os.environ.get('CLOUD_SQL_DATABASE_NAME') db_connection_name = os.environ.get('CLOUD_SQL_CONNECTION_NAME') def open_connection(): unix_socket = '/cloudsql/{}'.format(db_connection_name) try: if os.environ.get('GAE_ENV') == 'standard': conn = pymysql.connect(user=db_user, password=db_password, unix_socket=unix_socket, db=db_name, cursorclass=pymysql.cursors.DictCursor ) except pymysql.MySQLError as e: print(e) return conn def get_songs(): conn = open_connection() with conn.cursor() as cursor: result = cursor.execute('SELECT * FROM songs;') songs = cursor.fetchall() if result > 0: got_songs = jsonify(songs) else: got_songs = 'No Songs in DB' conn.close() return got_songs def add_songs(song): conn = open_connection() with conn.cursor() as cursor: cursor.execute('INSERT INTO songs (title, artist, genre) VALUES(%s, %s, %s)', (song["title"], song["artist"], song["genre"])) conn.commit() conn.close()
Burada birkaç şey yaptık.
Öncelikle app.yaml
dosyasından os.environ.get
yöntemini kullanarak veritabanı kimlik bilgilerimizi aldık. App Engine, app.yaml
içinde tanımlanan ortam değişkenlerini uygulamada kullanılabilir hale getirebilir.
İkinci olarak, bir open_connection
işlevi oluşturduk. Kimlik bilgileriyle MySQL veritabanımıza bağlanır.
Üçüncü olarak, iki fonksiyon ekledik: get_songs
ve add_songs
. İlki, open_connection
işlevini çağırarak veritabanına bir bağlantı başlatır. Ardından her satır için songs
tablosunu sorgular ve boşsa “DB'de Şarkı Yok” döndürür. add_songs
işlevi, songs
tablosuna yeni bir kayıt ekler.
Son olarak, başladığımız yere, main.py
dosyamıza dönüyoruz. Şimdi, daha önce yaptığımız gibi şarkılarımızı bir nesneden almak yerine, bir kayıt eklemek için add_songs
işlevini çağırıyoruz ve kayıtları veritabanından almak için get_songs
işlevini çağırıyoruz.
main.py
yeniden düzenleyelim:
#main.py from flask import Flask, jsonify, request from db import get_songs, add_songs app = Flask(__name__) @app.route('/', methods=['POST', 'GET']) def songs(): if request.method == 'POST': if not request.is_json: return jsonify({"msg": "Missing JSON in request"}), 400 add_songs(request.get_json()) return 'Song Added' return get_songs() if __name__ == '__main__': app.run()
get_songs
ve add_songs
fonksiyonlarını içe aktardık ve onları song songs()
görüntüleme fonksiyonumuzda çağırdık. Bir post
isteği add_songs
işlevini çağırırız ve bir get
isteği get_songs
işlevini çağırırız.
Ve uygulamamız bitti.
Sırada bir requirements.txt
dosyası eklemek var. Bu dosya, uygulamayı çalıştırmak için gerekli olan paketlerin bir listesini içerir. App Engine bu dosyayı kontrol eder ve listelenen paketleri yükler.
pip freeze | grep "Flask\|PyMySQL" > requirements.txt
Bu satır, uygulama için kullandığımız iki paketi (Flask ve PyMySQL) alır, bir requirements.txt
dosyası oluşturur ve paketleri ve sürümlerini dosyaya ekler.
Bu noktada, üç yeni dosya ekledik: db.py
, app.yaml
ve requirements.txt
.
Google App Engine'e dağıtın
Uygulamanızı dağıtmak için aşağıdaki komutu çalıştırın:
gcloud app deploy
İyi giderse, konsolunuz şunu çıkarır:

Uygulamanız artık App Engine'de çalışıyor. Tarayıcıda görmek için gcloud app browse
.
Gönderimizi test etmek ve istek get
için post
başlatabiliriz.


get
isteği gösterme (Büyük önizleme)Uygulamamız artık Google'ın altyapısında barındırılıyor ve sunucusuz bir mimarinin tüm avantajlarından yararlanmak için yapılandırmada ince ayar yapabiliyoruz. İleriye dönük olarak, sunucusuz uygulamanızı daha sağlam hale getirmek için bu makaleyi geliştirebilirsiniz.
Çözüm
App Engine ve Cloud SQL gibi bir hizmet olarak platform (PaaS) altyapısı kullanmak, temel olarak altyapı düzeyini soyutlar ve daha hızlı oluşturmamızı sağlar. Geliştiriciler olarak, yapılandırma, yedekleme ve geri yükleme, işletim sistemi, otomatik ölçeklendirme, güvenlik duvarları, geçiş trafiği vb. hakkında endişelenmemize gerek yok. Ancak, temel yapılandırma üzerinde denetime ihtiyacınız varsa, özel olarak oluşturulmuş bir hizmet kullanmak daha iyi olabilir.
Referanslar
- “Python'u İndirin”
- “venv — Sanal Ortamların Oluşturulması”, Python (belgeler)
- “Postacı İndir”
- "Bulut SQL", Google Cloud
- Google Bulut
- "Google Cloud Ücretsiz Katmanı", Google Cloud
- "Proje Oluşturma ve Yönetme", Google Cloud
- "VPC'ye Genel Bakış" (sanal özel bulut), Google Cloud
- "Uygulama Motoru", Google Bulut
- "Hızlı Başlangıçlar" (Google Cloud SDK'yı indirin), Google Cloud
- PyMySQL belgeleri