App Engine blobstore'u kullanma (Modül 15)

1. Genel Bakış

Sunucusuz Taşıma İstasyonu codelab'leri serisi (kendi kendine ilerleyen, uygulamalı eğiticiler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerinin uygulamalarını bir veya daha fazla taşıma işleminde yönlendirerek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu videolar genellikle eski hizmetlerden uzaklaştırılır. Bu sayede uygulamalarınızı daha taşınabilir hale getirir, daha fazla seçenek ve esneklik elde edebilir, daha geniş bir Cloud ürünü yelpazesiyle entegrasyon ve erişim elde edebilir, ayrıca yeni dil sürümlerine kolayca geçiş yapabilirsiniz. Başlangıçta özellikle App Engine (standart ortam) geliştiricileri olmak üzere ilk Cloud kullanıcılarına odaklanan bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda diğer sunucusuz platformları ya da diğer platformları kapsayacak kadar geniş kapsamlıdır.

Bu Modül 15 codelab'inde, App Engine blobstore kullanımının Modül 0'dan örnek uygulamaya nasıl ekleneceği açıklanmaktadır. 16. Modül'ün sonraki bölümünde, bu kullanımı Cloud Storage'a taşımaya hazır olacaksınız.

Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:

  • App Engine Blobstore API/kitaplığının kullanımını ekleyin
  • Kullanıcıların blobstore hizmetine yüklediklerini depolayın
  • Cloud Storage'a geçiş işleminin bir sonraki adımına hazırlanın

Gerekenler

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Arka plan

App Engine Blobstore API'den geçiş yapmak için bu API'nin kullanımını Modül 0'daki mevcut referans App Engine ndb uygulamasına ekleyin. Örnek uygulama, kullanıcıya yapılan son on ziyareti gösterir. Uygulamada, son kullanıcıdan "ziyaretlerine" karşılık gelen bir yapı (dosya) yüklemesini isteyecek şekilde değişiklik yapıyoruz. Kullanıcı bunu yapmak istemiyorsa bir "atla" seçeneği seçeneğini belirleyin. Kullanıcının kararından bağımsız olarak sonraki sayfada Modül 0'daki uygulamayla (ve bu serideki diğer modüllerin çoğunda) aynı çıkış oluşturulur. Bu App Engine blobstore entegrasyonu uygulandıktan sonra, bir sonraki (Modül 16) codelab'de bunu Cloud Storage'a taşıyabiliriz.

App Engine, Django ve Jinja2 şablon oluşturma sistemlerine erişim sağlar. Bu örneğin farklı olan yanı (Blobstore erişimi eklemenin yanı sıra), Modül 0'da Django kullanımı yerine 15. Modül'de Jinja2'ye geçiş yapmasıdır. App Engine uygulamalarını modernleştirmenin önemli adımlarından biri, web çerçevelerini webapp2 ürününden Flask'a taşımaktır. İkincisi ise varsayılan şablon oluşturma sistemi olarak Jinja2'yi kullanıyor. Biz de Jinja2'yi uygulayarak bu yönde ilerlemeye başlayıp Blobstore erişimi için webapp2 üzerinde kalarak devam ediyoruz. Flask varsayılan olarak Jinja2'yi kullandığından, 16. Modül'de şablonda değişiklik yapılmasına gerek yoktur.

3. Kurulum/Ön Çalışma

Eğiticinin ana bölümüne geçmeden önce projenizi oluşturun, kodu alın ve çalışan kodla başlamak için temel uygulamayı dağıtın.

1. Proje oluşturun

Modül 0 uygulamasını daha önce dağıttıysanız aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı olduğundan ve App Engine'in etkin olduğundan emin olun.

2. Temel örnek uygulamayı al

Bu codelab'in ön koşullarından biri, çalışan bir Modül 0 örnek uygulamasına sahip olmaktır. Bu SDK'ya sahip değilseniz "START" adlı Modül 0'dan edinebilirsiniz (bağlantıyı aşağıdaki bağlantı) tıklayın. Bu codelab'de, Modül 15'teki "FINISH"tekine benzeyen bir kodla sonlanacak ve her adımda size yol gösterilecektir. tıklayın.

Modül 0 BAŞLANGIÇ dosyalarının dizini aşağıdaki gibi görünmelidir:

$ ls
README.md               index.html
app.yaml                main.py

3. Temel uygulamayı (yeniden) dağıtma

Hemen yürütmek için kalan ön çalışma adımlarınız:

  1. gcloud komut satırı aracını yeniden tanıma
  2. Örnek uygulamayı gcloud app deploy ile yeniden dağıtın
  3. Uygulamanın App Engine'de sorunsuz çalıştığını onaylayın

Bu adımları başarıyla uygulayıp web uygulamanızın çalıştığını (aşağıdakine benzer bir çıkışla) gördükten sonra, uygulamanıza önbelleğe alma kullanımını eklemeye hazırsınız demektir.

a7a9d2b80d706a2b.png

4. Yapılandırma dosyalarını güncelleme

app.yaml

Uygulama yapılandırmasında önemli bir değişiklik yok ancak daha önce belirtildiği gibi, Django şablonundan (varsayılan) Jinja2'ye geçiliyor. Bu nedenle, kullanıcıların geçiş yapmak için App Engine sunucularında bulunan en son Jinja2 sürümünü belirtmesi ve bunu app.yaml içindeki yerleşik 3. taraf kitaplıklar bölümüne ekleyerek yapmanız gerekir.

ÖNCE:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

Buradakine benzer yeni bir libraries bölümü ekleyerek app.yaml dosyanızı düzenleyin:

SONRA:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: jinja2
  version: latest

Başka yapılandırma dosyasının güncellenmesine gerek olmadığından uygulama dosyalarına geçelim.

5. Uygulama dosyalarını değiştirme

İçe aktarma ve Jinja2 desteği

main.py için yapılan ilk değişiklik grubu, Blobstore API kullanımının eklenmesi ve Django şablonu oluşturmanın Jinja2 ile değiştirilmesini içerir. Değişiklikler aşağıda belirtilmiştir:

  1. os modülünün amacı, Django şablonuna giden bir dosya yol adı oluşturmaktır. Bu işlemin işlendiği Jinja2'ye geçiş yaptığımızdan, os ve Django şablon oluşturucu (google.appengine.ext.webapp.template) artık gerekli olmadığı için bu şablonlar kaldırılıyor.
  2. Blobstore API'yi içe aktarın: google.appengine.ext.blobstore
  3. Orijinal webapp çerçevesinde bulunan Blobstore işleyicilerini içe aktar (webapp2: google.appengine.ext.webapp.blobstore_handlers) içinde kullanılamayanlar
  4. Jinja2 desteğini webapp2_extras paketinden içe aktarın

ÖNCE:

import os
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template

main.py alan adındaki mevcut içe aktarma bölümünü aşağıdaki kod snippet'iyle değiştirerek yukarıdaki listede yer alan değişiklikleri uygulayın.

SONRA:

import webapp2
from webapp2_extras import jinja2
from google.appengine.ext import blobstore, ndb
from google.appengine.ext.webapp import blobstore_handlers

İçe aktarma işlemlerinden sonra, webapp2_extras dokümanlarda tanımlandığı şekilde Jinja2'nin kullanımını desteklemek için bazı standart kodlar ekleyin. Aşağıdaki kod snippet'i, standart webapp2 istek işleyici sınıfını Jinja2 işleviyle sarmalar. Bu nedenle, bu kod bloğunu main.py öğesine içe aktarma işlemlerinden hemen sonra ekleyin:

class BaseHandler(webapp2.RequestHandler):
    'Derived request handler mixing-in Jinja2 support'
    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_response(self, _template, **context):
        self.response.write(self.jinja2.render_template(_template, **context))

Blobstore desteği ekleme

Kullanıcı deneyiminde (çok) değişiklik yapılmadan örnek uygulamanın işlevlerini veya çıktılarını aynı (ya da neredeyse aynı) tuttuğumuz bu serideki diğer taşıma işlemlerinin aksine, bu örnek normdan daha radikal bir sapmayı gösteriyor. Hemen yeni bir ziyaret kaydetmek ve ardından son on ziyareti görüntülemek yerine, kullanıcıdan ziyaretini kaydedebileceği bir dosya yapısı istemek için uygulamayı güncelliyoruz. Son kullanıcılar daha sonra ilgili dosyayı yükleyebilir veya "Atla"yı seçebilir hiçbir şey yüklememesini sağlar. Bu adım tamamlandıktan sonra, "en son ziyaretler" görüntülenir.

Bu değişiklik sayesinde uygulamamız, söz konusu resmi veya diğer dosya türlerini en son ziyaretler sayfasında depolamak (ve muhtemelen daha sonra oluşturmak) için Blobstore hizmetini kullanabilir.

Veri modelini güncelleme ve kullanımını uygulama

Daha fazla veri depoluyoruz. Özellikle Blobstore'a yüklenen dosyanın kimliğini ("BlobKey" olarak adlandırılır) depolamak için veri modelini güncelliyor ve bunu store_visit() klasörüne kaydetmek için bir referans ekliyoruz. Bu ek veriler, sorgu sırasında diğer her şeyle birlikte döndürüldüğünden, fetch_visits() aynı kalır.

file_blob ve ndb.BlobKeyProperty ile ilgili bu güncellemelerin yer aldığı önceki ve sonraki dönemler:

ÖNCE:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

SONRA:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)
    file_blob = ndb.BlobKeyProperty()

def store_visit(remote_addr, user_agent, upload_key):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent),
            file_blob=upload_key).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

Şimdiye kadar yapılan değişikliklerin resimli temsili:

2270783776759f7f.png

Dosya yükleme işlemlerini destekleyin

İşlevsellikteki en önemli değişiklik, dosya yükleme işlemlerini desteklemektir. Bu, kullanıcıdan dosya isteğinde bulunma veya "atlama" işlemini destekleme olabilir. veya ziyarete karşılık gelen dosyayı oluşturmasını sağlar. Bütün bunlar resmin bir parçası. Dosya yükleme işlemlerini desteklemek için gereken değişiklikler şunlardır:

  1. GET adlı ana işleyici isteği, artık gösterilmek üzere en son ziyaretleri getirmiyor. Bunun yerine, kullanıcıdan yükleme istenir.
  2. Son kullanıcı yüklemek için bir dosya gönderdiğinde veya bu işlemi atladığında, formdaki bir POST kontrolü google.appengine.ext.webapp.blobstore_handlers.BlobstoreUploadHandler öğesinden türetilen yeni UploadHandler öğesine iletir.
  3. UploadHandler öğesinin POST yöntemi yüklemeyi gerçekleştirir, ziyareti kaydetmek için store_visit() yöntemini çağırır ve kullanıcıyı tekrar "/" konumuna göndermek için bir HTTP 307 yönlendirmesini tetikler. Burada...
  4. Ana işleyicinin POST yöntemi, (fetch_visits() üzerinden) için sorgu oluşturur ve en son ziyaretleri gösterir. Kullanıcı "atla"yı seçerse hiçbir dosya yüklenmez, ancak ziyaretin ardından aynı yönlendirme kaydedilir.
  5. En son ziyaretler ekranı, kullanıcıya gösterilen yeni bir alan içerir. Bu alan, köprü bağlantılı bir "görünüm"dür Bir yükleme dosyası mevcutsa veya "yok" aksi takdirde. Bu değişiklikler, yükleme formunun eklenmesiyle birlikte HTML şablonunda gerçekleşir (bu konuda daha fazla bilgi yakında sunulacaktır).
  6. Bir son kullanıcı "görüntüleme"yi tıklarsa bağlantısını ararsa google.appengine.ext.webapp.blobstore_handlers.BlobstoreDownloadHandler 'dan türetilen yeni bir ViewBlobHandler için GET isteğinde bulunur. Bu istek, bir resim varsa dosyayı oluşturur (tarayıcıda destekleniyorsa tarayıcıda), yoksa indirme isteğinde bulunur veya bulunmazsa HTTP 404 hatası döndürür.
  7. Ana işleyicinin, yukarıda açıklanan 307 yönlendirmesini alabilmesi için yeni işleyici sınıfı ve yeni rota çiftine ek olarak yeni bir POST yöntemine de ihtiyacı vardır.

Bu güncellemelerden önce Modül 0 uygulamasında yalnızca GET yöntemine ve tek bir rotaya sahip bir ana işleyici bulunuyordu:

ÖNCE:

class MainHandler(webapp2.RequestHandler):
    'main application (GET) handler'
    def get(self):
        store_visit(self.request.remote_addr, self.request.user_agent)
        visits = fetch_visits(10)
        tmpl = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(tmpl, {'visits': visits}))

app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

Bu güncellemeler uygulandığında artık üç işleyici vardır: 1) POST yöntemiyle yükleme işleyici, 2) "blobu görüntüleme" işleyiciyi GET yöntemiyle indirin ve 3) GET ile POST yöntemlerine sahip ana işleyiciyi indirin. Uygulamanızın geri kalanının aşağıdaki gibi görünmesi için bu değişiklikleri yapın.

SONRA:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    'Upload blob (POST) handler'
    def post(self):
        uploads = self.get_uploads()
        blob_id = uploads[0].key() if uploads else None
        store_visit(self.request.remote_addr, self.request.user_agent, blob_id)
        self.redirect('/', code=307)

class ViewBlobHandler(blobstore_handlers.BlobstoreDownloadHandler):
    'view uploaded blob (GET) handler'
    def get(self, blob_key):
        self.send_blob(blob_key) if blobstore.get(blob_key) else self.error(404)

class MainHandler(BaseHandler):
    'main application (GET/POST) handler'
    def get(self):
        self.render_response('index.html',
                upload_url=blobstore.create_upload_url('/upload'))

    def post(self):
        visits = fetch_visits(10)
        self.render_response('index.html', visits=visits)

app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/upload', UploadHandler),
    ('/view/([^/]+)?', ViewBlobHandler),
], debug=True)

Az önce eklediğimiz bu kodda birkaç önemli çağrı var:

  • MainHandler.get içinde blobstore.create_upload_url aranıyor. Bu çağrı, POST formunun URL'sini oluşturur ve dosyanın Blobstore'a gönderilmesi için yükleme işleyiciyi çağırır.
  • UploadHandler.post içinde blobstore_handlers.BlobstoreUploadHandler.get_uploads aranıyor. Dosyayı Blobstore'a yerleştiren ve bu dosya için benzersiz ve kalıcı bir kimlik (BlobKey) döndüren gerçek sihir budur.
  • ViewBlobHandler.get ürününde, bir dosyanın BlobKey ile blobstore_handlers.BlobstoreDownloadHandler.send çağrısı yapıldığında dosya getirilip son kullanıcının tarayıcısına yönlendirilir

Bu aramalar, uygulamaya eklenen özelliklere erişimin çoğunu temsil eder. main.py ile ilgili bu ikinci ve son değişiklik grubunun resimli temsili şu şekildedir:

da2960525ac1b90d.png

HTML şablonunu güncelle

Ana uygulamada yapılan güncellemelerden bazıları, uygulamanın kullanıcı arayüzünü etkiler. Bu nedenle, web şablonunda ilgili değişikliklerin yapılması gerekir.

  1. 3 giriş öğesinin yer aldığı bir dosya yükleme formu gerekiyor: sırasıyla dosya yükleme ve atlama için bir dosya ve bir çift gönder düğmesi.
  2. "Görünüm" ekleyerek en son ziyaret çıkışını güncelleyin karşılık gelen dosya yüklemesi veya "hiçbiri" içeren ziyaretler için bağlantı aksi takdirde.

ÖNCE:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

</body>
</html>

Güncellenen şablonu oluşturmak için yukarıdaki listede bulunan değişiklikleri uygulayın:

SONRA:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>

<h1>VisitMe example</h1>
{% if upload_url %}

<h3>Welcome... upload a file? (optional)</h3>
<form action="{{ upload_url }}" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"><p></p>
    <input type="submit"> <input type="submit" value="Skip">
</form>

{% else %}

<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }}
    <i><code>
    {% if visit.file_blob %}
        (<a href="/view/{{ visit.file_blob }}" target="_blank">view</a>)
    {% else %}
        (none)
    {% endif %}
    </code></i>
    from {{ visit.visitor }}
</li>
{% endfor %}
</ul>

{% endif %}

</body>
</html>

Bu resimde, index.html için yapılan gerekli güncellemeler gösterilmektedir:

8583e975f25aa9e7.png

Son olarak, Jinja2, şablonlarını bir templates klasöründe tercih ettiği için bu klasörü oluşturup index.html dosyasını bunun içine taşıyın. Bu son taşımayla birlikte, Blobstore kullanımını Modül 0 örnek uygulamasına eklemek için gerekli tüm değişiklikleri tamamlamış oldunuz.

(isteğe bağlı) Cloud Storage "geliştirme"

Blobstore depolama alanı zaman içinde Cloud Storage'a dönüştü. Yani Blobstore yüklemeleri, Cloud Console'da, özellikle de Cloud Storage tarayıcısında görünür. Soru nerede olduğudur. Cevap, App Engine uygulamanızın varsayılan Cloud Storage paketidir. Bu ad, App Engine uygulamanızın tam alan adıdır (PROJECT_ID.appspot.com). Tüm proje kimlikleri benzersiz olduğundan çok kullanışlı, değil mi?

Örnek uygulamada yapılan güncellemeler, yüklenen dosyaları bu pakete bırakır, ancak geliştiricilerin daha spesifik bir konum seçme seçeneği vardır. Varsayılan pakete google.appengine.api.app_identity.get_default_gcs_bucket_name() aracılığıyla programatik olarak erişilebilir. Bu değere erişmek istiyorsanız (örneğin, yüklenen dosyaları düzenlemek için önek olarak kullanmak istiyorsanız) yeni bir içe aktarma işlemi yapmanız gerekir. Örneğin, dosya türüne göre sıralama:

f61f7a23a1518705.png

Örneğin, resimler için buna benzer bir kod uygulamak isterseniz, aşağıdaki gibi bir kod ve istediğiniz paket adını seçmek için dosya türlerini kontrol eden bir kod alırsınız:

ROOT_BUCKET = app_identity.get_default_gcs_bucket_name()
IMAGE_BUCKET = '%s/%s' % (ROOT_BUCKET, 'images')

Ayrıca, resim türünü onaylamak için Python Standard Library imghdr modülü gibi bir araç kullanarak yüklenen resimleri doğrularsınız. Son olarak, kötü niyetli kişileri algılamak için yüklemelerin boyutunu sınırlamak isteyebilirsiniz.

Tüm bunların yapıldığını varsayalım. Uygulamamızı, yüklenen dosyaların depolanacağı yeri belirtmeyi destekleyecek şekilde nasıl güncelleyebiliriz? Önemli olan, aşağıdaki gibi gs_bucket_name parametresini ekleyerek yükleme için Cloud Storage'da istenen konumu belirtmek üzere MainHandler.get içindeki blobstore.create_upload_url çağrısını değiştirmektir:

blobstore.create_upload_url('/upload', gs_bucket_name=IMAGE_BUCKET))

Bu, yüklemelerin nereye gideceğini belirtmek istiyorsanız isteğe bağlı bir güncelleme olduğundan, depodaki main.py dosyasının bir parçası değildir. Bunun yerine, depoda incelemeniz için main-gcs.py adlı alternatif bir seçenek mevcut. Ayrı bir paket "klasörü" kullanmak yerine, main-gcs.py mağazasındaki kod, yüklemeleri "kök" klasörüne grubu (PROJECT_ID.appspot.com), main.py gibi, ancak bu bölümde ipucu verilen şekilde örneği türetmeniz durumunda ihtiyacınız olan yapıyı sağlar. Aşağıda "farkların" bir resmi main.py ile main-gcs.py arasında.

256e1ea68241a501.png

6. Özet/Temizlik

Bu bölümde, uygulamayı dağıtıp amaçlandığı şekilde ve yansıtılan herhangi bir çıkışta çalıştığını doğrulayarak bu codelab'i özetledik. Uygulama doğrulamasından sonra temizlik adımlarını uygulayın ve sonraki adımları değerlendirin.

Uygulamayı dağıtma ve doğrulama

Uygulamanızı gcloud app deploy ile yeniden dağıtın ve uygulamanın tanıtıldığı gibi çalıştığını, kullanıcı deneyimi (kullanıcı deneyimi) olarak Modül 0 uygulamasından farklı olduğunu onaylayın. Uygulamanızda şu anda iki farklı ekran var. Bunlardan ilki, "dosya yükleme formu" istemini ziyaret edin:

f5b5f9f19d8ae978.pngBuradan, son kullanıcılar bir dosya yükleyip "Gönder"i tıklar veya "Atla"yı tıklayın ve hiçbir şey yüklememesini sağlar. Her iki durumda da sonuç en son ziyaret ekranıdır ve artık "görüntüleme" ile zenginleştirilmiştir. bağlantılar veya "none" (hiçbiri) ve ziyaretçi bilgileri arasındaki farkları düşünün:

f5ac6b98ee8a34cb.png

Modül 0 örnek uygulamasına App Engine Blobstore kullanımını ekleyerek bu codelab'i tamamladığınız için tebrikler. Kodunuz artık FINISH (Modül 15) klasöründeki kodla eşleşmelidir. Bu klasörde alternatif main-gcs.py de mevcuttur.

Temizleme

Genel

Şimdilik işiniz bittiyse faturalandırılma olmaması için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Bununla birlikte, daha fazla test veya deneme yapmak isterseniz App Engine platformunun ücretsiz bir kotası vardır ve bu kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Burası işlem içindir, ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasına göz atın. Bu taşıma işlemi başka Cloud hizmetlerini içeriyorsa bunlar ayrı olarak faturalandırılır. Her iki durumda da (geçerliyse) "Bu codelab'e özel" bölümünü inceleyin bölümüne bakın.

Ayrıntılı açıklama için, App Engine gibi Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak küçük derleme ve depolama maliyetleri gerektirir. Cloud Build'in ve Cloud Storage'ın kendi ücretsiz kotası vardır. Söz konusu resmin depolanması bu kotanın bir kısmını kullanır. Ancak, bu kadar ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınız konusunda dikkatli olun. Belirli Cloud Storage "klasörleri" şunları incelemeniz gerekir:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Yukarıdaki depolama alanı bağlantıları PROJECT_ID ve *LOC*ifadenize bağlıdır (örneğin, "us") Uygulamanız ABD'de barındırılıyorsa.

Öte yandan, bu uygulamayı veya diğer ilgili taşıma codelab'lerini kullanmayacak ve her şeyi tamamen silmek istiyorsanız projenizi kapatın.

Bu codelab'e özel

Aşağıda listelenen hizmetler bu codelab'e özeldir. Daha fazla bilgi için her ürünün belgelerine bakın:

Sonraki adımlar

Dikkate alınması gereken bir sonraki mantıksal taşıma işlemi, geliştiricilerin App Engine Blobstore hizmetinden Cloud Storage istemci kitaplığını kullanmaya nasıl geçeceğini gösteren Modül 16'da ele alındı. Yükseltmenin avantajları arasında daha fazla Cloud Storage özelliğine erişebilme ve Google Cloud'daki, diğer bulutlardaki veya hatta şirket içindeki App Engine dışındaki uygulamalarda çalışan bir istemci kitaplığına aşina olmak yer alır. Cloud Storage'ın sunduğu tüm özelliklere ihtiyacınız olmadığını düşünmüyor veya özelliklerin maliyet üzerindeki etkisinden endişe ediyorsanız App Engine Blobstore'da kalmaya devam edebilirsiniz.

Modül 16'nın ötesinde Cloud NDB ve Cloud Datastore, Cloud Tasks veya Cloud Memorystore gibi diğer olası taşıma işlemlerinin tümü yer alır. Ayrıca Cloud Run ve Cloud Functions'a ürünler arası taşıma işlemleri de yapılabilir. Taşıma deposu tüm kod örneklerini içerir, sizi mevcut tüm codelab'lere ve videolara yönlendirir, ayrıca hangi taşıma işlemlerinin göz önünde bulundurulacağı ve ilgili "siparişler" konusunda rehberlik sağlar. devam edebilir.

7. Ek kaynaklar

Codelab sorunları/geri bildirimi

Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:

Taşıma kaynakları

Modül 0 (START) ve Modül 15 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bunlara tüm App Engine codelab taşıma işlemleri için depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası indirebilirsiniz.

Codelab

Python 2

Python 3

Modül 0

kod

Yok

Modül 15 (bu codelab)

kod

Yok

Çevrimiçi kaynaklar

Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:

App Engine

Google Cloud

Python

Videolar

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.