Özet
Bu codelab'de, Python Flask web uygulamasını App Engine esnek ortamına nasıl dağıtacağınızı öğreneceksiniz. Örnek uygulama, kullanıcının bir kişinin yüzünün fotoğrafını yüklemesine ve kişinin mutlu olma olasılığını öğrenmesine olanak tanır. Uygulama, Vision, Storage ve Datastore için Google Cloud API'lerini kullanır.
App Engine hakkında
Google App Engine uygulamaları kolayca oluşturulabilir, kolayca korunabilir ve trafik ile veri depolama ihtiyaçlarınız değiştikçe kolayca ölçeklendirilebilir. App Engine ile bakımını yapmanız gereken sunucu yoktur. Uygulamanızı yüklemeniz yeterlidir.
App Engine uygulamaları, gelen trafiğe göre otomatik olarak ölçeklendirilir. Yük dengeleme, mikro hizmetler, yetkilendirme, SQL ve NoSQL veritabanları, trafik bölme, günlük kaydı, arama, sürüm oluşturma, kullanıma sunma ve geri alma işlemleri ile güvenlik taraması yerel olarak desteklenir ve son derece özelleştirilebilir.
App Engine'in esnek ortamı şu programlama dillerinin tümünü destekler: C#, Go, Java, Node.js, PHP, Python ve Ruby. App Engine esnek ortamı, uygulamanızı Google Compute Engine sanal makinelerinde çalışan Docker container'larında çalıştırır. App Engine'in standart ortamı, Python da dahil olmak üzere belirli diller için alternatif bir seçenektir. App Engine Standart, uygulamanızı daha kısıtlayıcı bir korumalı alan ortamında çalıştırır. Daha fazla bilgi için App Engine ortamı seçme başlıklı bölümü inceleyin.
Neler öğreneceksiniz?
- Basit bir web uygulamasını App Engine esnek ortamına dağıtma
- Vision, Storage ve Datastore için Google Cloud istemci kitaplıklarına erişme
- Çeşitli bulut kaynaklarını yönetmek için Google Cloud Console ve Google Cloud SDK'yı kullanma
- Cloud Shell'i kullanma
Gerekenler
- Python hakkında bilgi
- Vim, Emacs veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi sahibi olmanız
Proje Oluşturma
Henüz bir Google Hesabınız (Gmail veya Google Apps) yoksa oluşturmanız gerekir. Google Cloud Platform Console'da (console.cloud.google.com) oturum açın ve yeni bir proje oluşturun:



Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.
Faturalandırma
Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak birkaç dolardan fazla tutmaz. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet artabilir.
Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme sürümünden yararlanabilir.
Google Cloud'u dizüstü bilgisayarınızdan uzaktan çalıştırabilirsiniz ancak bu codelab'de bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız. Bu Debian tabanlı sanal makine, ihtiyaç duyacağınız tüm geliştirme araçları (gcloud, python, virtualenv, pip ve daha fazlası) yüklü olarak gelir. 5 GB kalıcı ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu nedenle, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (Chromebook'ta da çalışır).
Google Cloud Shell'i etkinleştirmek için geliştirici konsolunda sağ üst taraftaki düğmeyi tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç dakika sürer):


Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulanmış olduğunu ve projenin PROJECT_ID'nize göre ayarlandığını görürsünüz:
gcloud auth list Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project [core] Project = <PROJECT_ID>
Herhangi bir nedenle proje ayarlanmamışsa aşağıdaki komutu vermeniz yeterlidir:
gcloud config set project <PROJECT_ID>
PROJECT_ID değerinizi mi arıyorsunuz? Kurulum adımlarında hangi proje kimliğini kullandığınızı kontrol edin veya konsol kontrol panelinde arayın:

Cloud Shell'de komut satırında, GitHub deposunu klonlamak için aşağıdaki komutu çalıştırın:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Dizini python-docs-samples/codelabs/flex_and_vision olarak değiştirin:
cd python-docs-samples/codelabs/flex_and_vision
Vision, Storage ve Datastore API'lerini kullanmaya başlamadan önce aşağıdaki komutlarla API'leri etkinleştirmeniz gerekir:
gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com
Vision, Storage ve Datastore API'lerine istekte bulunmak için hizmet hesabı kimlik bilgilerine ihtiyacınız vardır. Projenizdeki hizmet hesabı kimlik bilgileri, gcloud aracı kullanılarak oluşturulabilir.
PROJECT_ID için bir ortam değişkeni ayarlayın. [YOUR_PROJECT_ID] kısmını kendi proje kimliğinizle değiştirin:
export PROJECT_ID=[YOUR_PROJECT_ID]
Yerel olarak test yaparken Google Cloud API'lerine erişmek için bir hizmet hesabı oluşturun:
gcloud iam service-accounts create codelab \ --display-name "My Codelab Service Account"
Yeni oluşturduğunuz hizmet hesabına uygun izinler verin:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/ownerHizmet Hesabınızı oluşturduktan sonra bir hizmet hesabı anahtarı oluşturun:
gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.comBu komut, ana dizininizde key.json adlı bir JSON dosyasında depolanan bir hizmet hesabı anahtarı oluşturur.
Oluşturulan anahtarın mutlak yolunu kullanarak Cloud Shell'de hizmet hesabı anahtarınız için bir ortam değişkeni ayarlayın:
export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"Vision API'nin kimliğini doğrulama hakkında daha fazla bilgi edinebilirsiniz.
Sanal Ortamınızı Başlatma ve Bağımlılıkları Yükleme
virtualenv ile env adlı yalıtılmış bir Python 3 ortamı oluşturun:
virtualenv -p python3 env
Yeni oluşturduğunuz env adlı virtualenv'i girin:
source env/bin/activate
Projenizin bağımlılıklarını requirements.txt dosyasından yüklemek için pip'i kullanın:
pip install -r requirements.txt
requirements.txt dosyası, projeniz için gereken paket bağımlılıklarının listesidir. Yukarıdaki komut, listelenen tüm paket bağımlılıklarını virtualenv'e indirdi.
App Engine uygulaması oluşturma
Ardından, aşağıdaki komutu kullanarak bir App Engine örneği oluşturun:
gcloud app createStorage paketi oluşturma
Öncelikle CLOUD_STORAGE_BUCKET ortam değişkenini PROJECT_ID'nizin adıyla eşitleyin. (Kolaylık sağlaması açısından, paketinizin adını PROJECT_ID'nizle aynı yapmanız genellikle önerilir.)
export CLOUD_STORAGE_BUCKET=${PROJECT_ID}Uygulamamız, Cloud Shell'den gsutil adlı bir araçla oluşturmanız gereken bir Cloud Storage paketi kullanır. Aşağıdaki komutu çalıştırın. Bu komut, PROJECT_ID'nizle aynı ada sahip bir paket oluşturur.
gsutil mb gs://${PROJECT_ID}Uygulamayı çalıştırma
python main.py
Uygulama başladıktan sonra Cloud Shell araç çubuğunda Web Önizlemesi simgesini
tıklayın ve "8080 numaralı bağlantı noktasında önizle"yi seçin.

Tarayıcınızda bir sekme açılır ve yeni başlattığınız sunucuya bağlanır. Aşağıdakine benzer bir tablo görürsünüz:

İnsan yüzü içeren bir fotoğraf yüklemeyi deneyin. Dosya Seç düğmesini tıklayın, bilgisayarınızdan bir resim seçin ve Gönder'i tıklayın.
Fotoğraf yükledikten sonra aşağıdakine benzer bir ekranla karşılaşırsınız:

Örnek Kod Düzeni
Örnek aşağıdaki düzene sahiptir:
templates/
homepage.html /* HTML template that uses Jinja2 */
app.yaml /* App Engine application configuration file */
main.py /* Python Flask web application */
requirements.txt /* List of dependencies for the project */main.py
Bu Python dosyası, bir Flask web uygulamasıdır. Uygulama, kullanıcıların fotoğraf göndermesine (tercihen yüz fotoğrafları) olanak tanır. Bu fotoğraflar Cloud Storage'da depolanır ve Cloud Vision API'nin yüz algılama özelliği kullanılarak analiz edilir. Her fotoğrafla ilgili temel bilgiler, Google Cloud Platform'un NoSQL veritabanı olan Datastore'da depolanır. Bu bilgilere, kullanıcı web sitesini her ziyaret ettiğinde erişilir.
Bu uygulama, Storage, Datastore ve Vision için Google Cloud Platform istemci kitaplıklarını kullanır. Bu istemci kitaplıkları, Cloud API'lerine en sevdiğiniz programlama dillerinden kolayca erişmenizi sağlar.
Kodun bazı önemli snippet'lerine göz atalım.
Üstteki içe aktarma bölümünde, kodumuz için ihtiyaç duyduğumuz çeşitli paketleri içe aktarırız. Datastore, Storage ve Vision için Google Cloud istemci kitaplıklarımızı şu şekilde içe aktarıyoruz:
from google.cloud import datastore
from google.cloud import storage
from google.cloud import visionKullanıcı web sitesinin kök URL'sini ziyaret ettiğinde gerçekleşen işlemlerin kodu aşağıda verilmiştir. Datastore istemci kitaplığına erişmek için kullanılan bir Datastore istemci nesnesi oluştururuz. Ardından, Faces türündeki varlıklar için Datastore'da bir sorgu çalıştırırız. Son olarak, HTML şablonumuzu oluşturup Datastore'dan çıkardığımız image_entities öğelerini değişken olarak iletiyoruz.
@app.route('/')
def homepage():
# Create a Cloud Datastore client.
datastore_client = datastore.Client()
# Use the Cloud Datastore client to fetch information from Datastore about
# each photo.
query = datastore_client.query(kind='Faces')
image_entities = list(query.fetch())
# Return a Jinja2 HTML template and pass in image_entities as a parameter.
return render_template('homepage.html', image_entities=image_entities)Varlıkların Datastore'a nasıl kaydedildiğine bakalım. Datastore, Google Cloud'un NoSQL veritabanı çözümüdür. Veriler, varlık adı verilen nesnelerde depolanır. Her varlığa, tür ve anahtar adı dizesi kullanılarak oluşturulabilen benzersiz bir tanımlayıcı anahtar atanır. Tür, ne tür bir varlık olduğuna dair bir kuruluş grubu oluşturur. Örneğin, Fotoğraflar, Kişiler ve Hayvanlar için türler oluşturmak isteyebiliriz.
Her varlık, tamsayılar, kayan sayılar, dizeler, tarihler veya ikili veriler gibi çeşitli türlerde değerlere sahip olabilen, geliştirici tarafından tanımlanmış birden fazla özelliğe sahip olabilir.
# Create a Cloud Datastore client.
datastore_client = datastore.Client()
# Fetch the current date / time.
current_datetime = datetime.now()
# The kind for the new entity.
kind = 'Faces'
# The name/ID for the new entity.
name = blob.name
# Create the Cloud Datastore key for the new entity.
key = datastore_client.key(kind, name)
# Construct the new entity using the key. Set dictionary values for entity
# keys blob_name, storage_public_url, timestamp, and joy.
entity = datastore.Entity(key)
entity['blob_name'] = blob.name
entity['image_public_url'] = blob.public_url
entity['timestamp'] = current_datetime
entity['joy'] = face_joy
# Save the new entity to Datastore.
datastore_client.put(entity)Storage ve Vision istemci kitaplıklarına, Datastore'a benzer şekilde programatik olarak erişilebilir. Örnek kodun tamamını incelemek için vim, emacs veya nano kullanarak main.py dosyasını kendiniz açabilirsiniz.
Flask hakkında daha fazla bilgiyi http://flask.pocoo.org/ adresinde bulabilirsiniz.
İstemci kitaplıkları hakkında daha fazla bilgiyi https://googlecloudplatform.github.io/google-cloud-python/ adresinde bulabilirsiniz.
homepage.html
Flask web çerçevesi, şablon motoru olarak Jinja2'den yararlanır. Bu sayede, main.py dosyasındaki değişkenleri ve ifadeleri homepage.html dosyasına aktarabiliriz. Bu değişkenler ve ifadeler, sayfa oluşturulduktan sonra değerlerle değiştirilir.
Jinja2 hakkında daha fazla bilgiyi http://jinja.pocoo.org/docs/2.9/templates/ adresinde bulabilirsiniz.
Bu Jinja2 HTML şablonu, kullanıcıların veritabanına fotoğraf gönderebileceği bir form gösterir. Ayrıca, daha önce gönderilen her resmi dosya adı, yükleme tarihi/saati ve Vision API tarafından algılanan yüzün mutlu olma olasılığıyla birlikte gösterir.
homepage.html
<h1>Google Cloud Platform - Face Detection Sample</h1>
<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>
<br>
<html>
<body>
<form action="upload_photo" method="POST" enctype="multipart/form-data">
Upload File: <input type="file" name="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>App Engine Esnek, bir uygulamanın dağıtım yapılandırmasını açıklamak için app.yaml adlı bir dosyayı kullanır. Bu dosya yoksa App Engine, dağıtım yapılandırmasını tahmin etmeye çalışır. Ancak bu dosyayı sağlamanız önerilir.
Ardından, app.yaml dosyasını tercih ettiğiniz bir düzenleyici (vim, nano veya emacs) kullanarak değiştireceksiniz. nano düzenleyiciyi kullanacağız:
nano app.yamlapp.yaml
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
env_variables:
CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>Bu, Python 3 App Engine Flex uygulamasını dağıtmak için gereken temel yapılandırmadır. App Engine'i yapılandırma hakkında daha fazla bilgiyi burada bulabilirsiniz.
app.yaml dosyasını açtıktan sonra < your-cloud-storage-bucket > kısmını Cloud Storage paketinizin adıyla değiştirin. (Cloud Storage grubunuzun adını unuttuysanız Qwiklabs'ten GCP proje kimliğini kopyalayın. Bu kimlik aynıdır.) env_variables bölümü, uygulama dağıtıldıktan sonra main.py'de kullanılacak ortam değişkenlerini ayarlar.
Artık nano'da (Ctrl + x) tuşlarını kullanarak dosyayı kaydedip kapatabilirsiniz. Bu işlem aşağıdaki istemi gösterir:

y harfini yazın ve ardından aşağıdaki istem için dosya adını onaylamak üzere ENTER tuşuna bir kez daha basın:

gcloud'u kullanarak uygulamanızı App Engine'e dağıtın:
gcloud app deployUygulama dağıtıldıktan sonra web tarayıcınızda https://< PROJECT_ID >.appspot.com URL'sini açarak uygulamayı ziyaret edebilirsiniz.
Özet
Bu adımda, bir Python web uygulaması oluşturup App Engine esnek ortamına dağıttınız.
İlk App Engine esnek web uygulamanızı yazmayı ve dağıtmayı öğrendiniz.
Temizleme
Bu hızlı başlangıçta kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirmesini önlemek amacıyla:
- Cloud Platform Console'a gidin.
- Kapatmak istediğiniz projeyi seçin, ardından üst kısımdaki "Sil"i tıklayın. Bu işlem, projenin silinmesini planlar.
Daha Fazla Bilgi
- Google Cloud Platform'da Python: https://cloud.google.com/python/
- Python için App Engine Esnek Dokümanları: https://cloud.google.com/appengine/docs/flexible/python/
- Python istemci kitaplıkları için dokümanlar: Datastore, Storage ve Vision
- Diğer Python kodu örnekleri: https://cloud.google.com/python/samples
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.