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
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Çalışan bir Modül 0 App Engine uygulaması (depodan edinin)
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
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.
- BAŞLAT: Modül 0 klasörü (Python 2)
- SON: Modül 15 klasörü (Python 2)
- Deponun tamamı (ZIP dosyasını klonlamak veya indirmek için)
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:
gcloud
komut satırı aracını yeniden tanıma- Örnek uygulamayı
gcloud app deploy
ile yeniden dağıtın - 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.
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:
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.- Blobstore API'yi içe aktarın:
google.appengine.ext.blobstore
- Orijinal
webapp
çerçevesinde bulunan Blobstore işleyicilerini içe aktar (webapp2
:google.appengine.ext.webapp.blobstore_handlers
) içinde kullanılamayanlar - 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:
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:
GET
adlı ana işleyici isteği, artık gösterilmek üzere en son ziyaretleri getirmiyor. Bunun yerine, kullanıcıdan yükleme istenir.- 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 yeniUploadHandler
öğesine iletir. UploadHandler
öğesininPOST
yöntemi yüklemeyi gerçekleştirir, ziyareti kaydetmek içinstore_visit()
yöntemini çağırır ve kullanıcıyı tekrar "/" konumuna göndermek için bir HTTP 307 yönlendirmesini tetikler. Burada...- 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. - 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).
- 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 birViewBlobHandler
içinGET
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. - 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çindeblobstore.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çindeblobstore_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ınBlobKey
ileblobstore_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:
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.
- 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.
- "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:
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:
Ö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.
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:
Buradan, 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:
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:
- App Engine Blobstore hizmeti, Depolanan Veri kotaları ve sınırları kapsamındadır. Bu nedenle bu hizmeti ve eski paketlenmiş hizmetlerin fiyatlandırma sayfasını inceleyin.
- App Engine Datastore hizmeti, aynı zamanda ücretsiz bir katmana sahip olan Cloud Datastore (Data Store modunda Cloud Firestore) tarafından sağlanır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
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 | Yok | |
Modül 15 (bu codelab) | Yok |
Çevrimiçi kaynaklar
Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:
App Engine
- App Engine Blobstore hizmeti
- App Engine Depolanan Veri kotaları ve sınırları
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 2 App Engine'de App Engine yerleşik kitaplıklarını kullanma
- App Engine fiyatlandırması ve kota bilgileri
- İkinci nesil App Engine platformunun kullanıma sunulması (2018)
- Birinci ve ikinci nesil platformlar
- Eski çalışma zamanları için uzun süreli destek
- Belge taşıma örnekleri deposu
- Topluluğun katkıda bulunduğu taşıma örnekleri deposu
Google Cloud
- Google Cloud Platform'da Python
- Google Cloud Python istemci kitaplıkları
- Google Cloud "Daima Ücretsiz" katman
- Google Cloud SDK (gcloud komut satırı aracı)
- Tüm Google Cloud belgeleri
Python
- Django ve Jinja2 şablon oluşturma sistemleri
webapp2
web çerçevesiwebapp2
belgeleriwebapp2_extras
bağlantıwebapp2_extras
Jinja2 dokümanları
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Teknolojisi'ne abone olun
- Google Developers'a abone olun
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.