1. Omówienie
Seria ćwiczeń z programowania dla bezserwerowych stacji migracji (samouczek, samouczków) i podobnych filmów ma pomóc deweloperom bezserwerowych Google Cloud w modernizacji aplikacji przez przeprowadzenie co najmniej 1 migracji, w wyniku rezygnacji ze starszych usług. W ten sposób Twoje aplikacje stają się bardziej przenośne, mają więcej opcji i elastyczność, co pozwala na integrację z szerszą gamą usług Cloud i uzyskiwanie do nich dostępu, a także łatwiejsze przejście na nowsze wersje językowe. Choć początkowo koncentrowaliśmy się na pierwszych użytkownikach Cloud, głównie deweloperów korzystających ze środowiska App Engine (środowisko standardowe), ta seria jest na tyle szeroka, aby uwzględnić inne platformy bezserwerowe, takie jak Cloud Functions i Cloud Run, oraz inne, w stosownych przypadkach.
W tym ćwiczeniu z programowania w części 15 wyjaśniamy, jak dodać wykorzystanie App Engine blobstore
do przykładowej aplikacji z modułu 0. Gdy to zrobisz, w module 16 możesz przejść do migracji tych danych do Cloud Storage.
Dowiesz się, jak:
- Dodaj sposób korzystania z interfejsu API/biblioteki App Engine Blobstore
- Przechowuj w usłudze
blobstore
przesłane przez użytkowników pliki - Przygotowanie do następnego kroku migracji do Cloud Storage
Czego potrzebujesz
- projekt Google Cloud Platform z aktywnym kontem rozliczeniowym GCP;
- Podstawowe umiejętności w języku Python
- praktyczna znajomość typowych poleceń w Linuksie
- Podstawowa wiedza o tworzeniu i wdrażaniu aplikacji App Engine.
- działającą aplikację App Engine z modułu 0 (pobranie z repozytorium).
Ankieta
Jak wykorzystasz ten samouczek?
Jak oceniasz swoje doświadczenia z językiem Python?
Jak oceniasz korzystanie z usług Google Cloud?
2. Tło
Aby przeprowadzić migrację z interfejsu App Engine Blobstore API, dodaj dane o korzystaniu z tej funkcji do dotychczasowej bazowej aplikacji App Engine ndb
z modułu 0. Przykładowa aplikacja wyświetla 10 ostatnich wizyt użytkownika. Modyfikujemy aplikację, aby poprosić użytkownika o przesłanie artefaktu (pliku) powiązanego z jego „wizytą”. Jeśli użytkownik nie chce tego robić, dostępny jest przycisk „pomiń”. . Niezależnie od decyzji użytkownika następna strona renderuje te same dane wyjściowe co aplikacja z Modułu 0 (i wielu innych modułów z tej serii). Dzięki wdrożeniu integracji z App Engine blobstore
możemy przenieść tę usługę do Cloud Storage w ramach kolejnego ćwiczenia z programowania (Moduł 16).
App Engine zapewnia dostęp do systemów szablonów Django i Jinja2. Różnica polega na tym, że ten przykład (oprócz dostępu do Blobstore) przełącza się z Django w module 0 na Jinja2 w module 15. Kluczowym krokiem w modernizacji aplikacji App Engine jest przeniesienie platform internetowych z webapp2
do Flask. W tym drugim przypadku używany jest Jinja2 jako domyślny system szablonów, więc zaczynamy pójść w tym kierunku, implementując Jinja2, zachowując dostęp do Blobstore na poziomie webapp2
. Ponieważ Flask domyślnie korzysta z Jinja2, w części 16 nie będą wymagane żadne zmiany w szablonie.
3. Konfiguracja/praca
Zanim przejdziemy do głównej części samouczka, skonfiguruj projekt, pobierz kod i wdróż aplikację bazową, aby zacząć od działającego kodu.
1. Konfigurowanie projektu
Jeśli aplikacja modułu 0 została już wdrożona, zalecamy ponowne użycie tego samego projektu (i kodu). Możesz też utworzyć nowy projekt lub wykorzystać inny istniejący projekt. Sprawdź, czy projekt ma aktywne konto rozliczeniowe i jest włączona usługa App Engine.
2. Pobierz przykładową aplikację bazową
Jednym z warunków wstępnych tego ćwiczenia z programowania jest posiadanie działającej przykładowej aplikacji w module 0. Jeśli go nie masz, możesz go pobrać w module 0 „START” (link poniżej). To ćwiczenie w Codelabs przeprowadzi Cię przez poszczególne kroki, kończąc kodem przypominającym to, co znajduje się w module 15 „FINISH”. folderu Dysku.
- START: folder modułu 0 (Python 2)
- ZAKOŃCZ: folder modułu 15 (Python 2)
- Całe repozytorium (aby sklonować lub pobrać plik ZIP)
Katalog plików START z modułem 0 powinien wyglądać tak:
$ ls README.md index.html app.yaml main.py
3. (Ponowne) wdrażanie aplikacji podstawowej
Pozostałe kroki do wykonania:
- Ponownie zapoznaj się z narzędziem wiersza poleceń
gcloud
- Wdróż ponownie przykładową aplikację za pomocą
gcloud app deploy
- Sprawdź, czy aplikacja działa w App Engine bez problemów
Po wykonaniu tych czynności i sprawdzeniu, że aplikacja internetowa działa (z danymi wyjściowymi podobnymi do widocznych poniżej), możesz dodać do niej funkcję zapisywania w pamięci podręcznej.
4. Aktualizowanie plików konfiguracji
app.yaml
Nie wprowadziliśmy istotnych zmian w konfiguracji aplikacji, ale jak już wspomnieliśmy, przechodzimy z szablonów Django (domyślnego) na Jinja2. Aby przejść na nową wersję, użytkownicy powinni wybrać najnowszą wersję Jinja2 dostępną na serwerach App Engine. W tym celu dodaj ją do sekcji z wbudowanymi bibliotekami innych firm w app.yaml
.
PRZED:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
Edytuj plik app.yaml
, dodając nową sekcję libraries
taką jak tutaj:
PO:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
Żadne inne pliki konfiguracji nie wymagają aktualizacji, więc przejdźmy do plików aplikacji.
5. Modyfikowanie plików aplikacji
Importy i obsługa Jinja2
Pierwszy zestaw zmian w interfejsie main.py
obejmuje dodanie interfejsu Blobstore API i zastąpienie szablonów Django przez Jinja2. Co się zmienia:
- Moduł
os
służy do utworzenia nazwy ścieżki pliku do szablonu Django. Przechodzimy na Jinja2, gdzie ten proces jest obsługiwany, więc korzystanie z interfejsuos
oraz mechanizmu renderowania szablonu Django (google.appengine.ext.webapp.template
) nie są już potrzebne, dlatego je usuniemy. - Zaimportuj interfejs Blobstore API:
google.appengine.ext.blobstore
- Zaimportuj moduły obsługi Blobstore znalezione w pierwotnej platformie
webapp
– są one niedostępne wwebapp2
:google.appengine.ext.webapp.blobstore_handlers
- Importuj obsługę Jinja2 z pakietu
webapp2_extras
PRZED:
import os
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template
Wprowadź zmiany z powyższej listy, zastępując bieżącą sekcję importowania w interfejsie main.py
poniższym fragmentem kodu.
PO:
import webapp2
from webapp2_extras import jinja2
from google.appengine.ext import blobstore, ndb
from google.appengine.ext.webapp import blobstore_handlers
Po zaimportowaniu dodaj stały kod, aby obsługiwać użycie Jinja2 zgodnie z definicją w dokumentacji webapp2_extras
. Poniższy fragment kodu opakowuje standardową klasę obsługi żądań Webapp2 z funkcją Jinja2, więc dodaj ten blok kodu do main.py
zaraz po zaimportowaniu:
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))
Dodawanie obsługi Blobstore
W odróżnieniu od innych migracji w tej serii, w których funkcje lub dane wyjściowe przykładowej aplikacji są identyczne (bądź prawie takie same) bez (znacznych) zmian w interfejsie użytkownika, w tym przykładzie mamy do czynienia z bardziej radykalnym odejściem od normy. Zamiast natychmiast rejestrować nową wizytę i wyświetlać ostatnie 10 z nich, aktualizujemy aplikację, więc prosimy użytkownika o podanie artefaktu pliku, w którym będzie on mógł zarejestrować wizytę. Użytkownicy mogą przesłać odpowiedni plik lub wybrać „Pomiń” aby wcale nie przesyłać niczego. Po zakończeniu tego kroku sekcja „Ostatnie wizyty”
Ta zmiana umożliwi naszej aplikacji wykorzystanie usługi Blobstore do przechowywania (i ewentualnego renderowania) tego obrazu lub innego typu plików na stronie ostatniej wizyty.
Zaktualizuj model danych i wdróż jego zastosowanie
Przechowujemy więcej danych, a w szczególności aktualizujemy model danych, aby przechowywał identyfikator (nazywany „BlobKey
”) pliku przesłanego do Blobstore i dodaliśmy odwołanie pozwalające zapisać ten identyfikator w store_visit()
. Te dodatkowe dane są zwracane wraz ze wszystkimi pozostałymi danymi w odpowiedzi na zapytanie, więc parametr fetch_visits()
pozostaje bez zmian.
Oto wydarzenia przed i po, które pochodzą z najnowszych źródeł, takich jak file_blob
(ndb.BlobKeyProperty
):
PRZED:
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)
PO:
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)
Oto obrazowe przedstawienie wprowadzonych do tej pory zmian:
Obsługa przesyłania plików
Największą zmianą w funkcjonalności jest obsługa przesyłania plików, niezależnie od tego, czy użytkownik prosi o jej pobranie, czy „pominąć”. lub renderowanie pliku odpowiadającego wizycie. To wszystko jest częścią obrazu. Oto zmiany wymagane do obsługi przesyłania plików:
- Żądanie głównego modułu obsługi
GET
nie pobiera już do wyświetlenia ostatnich wizyt. Zamiast tego wyświetla użytkownikowi prośbę o przesłanie pliku. - Gdy użytkownik prześle plik do przesłania lub pominie ten proces, pole
POST
z formularza przekazuje kontrolę do nowego elementuUploadHandler
utworzonego na podstawiegoogle.appengine.ext.webapp.blobstore_handlers.BlobstoreUploadHandler
. - Metoda
POST
wUploadHandler
przeprowadza przesyłanie, wywołuje metodęstore_visit()
w celu zarejestrowania wizyty i wywołuje przekierowanie HTTP 307, które kieruje użytkownika z powrotem do strony „/”, gdzie... - Metoda
POST
głównego modułu obsługi zapytania (za pomocąfetch_visits()
) i wyświetla ostatnie wizyty. Jeśli użytkownik wybierze „pomiń”, nie został przesłany żaden plik, ale wizyta zostaje zarejestrowana, po czym następuje to samo przekierowanie. - Widok ostatnich wizyt zawiera nowe pole wyświetlane użytkownikowi: hiperlink do listy „widoku” jeśli przesyłany plik jest dostępny lub wartość „brak” w przeciwnym razie. Te zmiany są wprowadzane w szablonie HTML wraz z formularzem przesyłania (więcej informacji na ten temat wkrótce).
- Jeśli użytkownik kliknie przycisk „Wyświetl” w przypadku każdej wizyty z przesłanym filmem, wysyła żądanie
GET
do nowego elementuViewBlobHandler
utworzonego na podstawiegoogle.appengine.ext.webapp.blobstore_handlers.BlobstoreDownloadHandler
. W przeciwnym razie plik jest renderowany z obrazem (w przeglądarce, jeśli jest obsługiwany), wyświetla w razie potrzeby żądanie pobrania pliku lub zwraca błąd HTTP 404, jeśli nie znaleziono go. - Oprócz nowej pary klas modułów obsługi oraz nowej pary tras do wysyłania ruchu do nich główny moduł obsługi wymaga nowej metody
POST
w celu otrzymania opisanego powyżej przekierowania 307.
Wcześniej aplikacja modułu 0 zawierała tylko główny moduł obsługi z metodą GET
i jedną trasą:
PRZED:
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)
Po wdrożeniu tych aktualizacji dostępne są teraz 3 moduły obsługi: 1) moduł obsługi przesyłania z metodą POST
, 2) „wyświetl obiekt blob”. moduł obsługi pobierania z metodą GET
oraz 3) główny moduł obsługi z metodami GET
i POST
. Wprowadź te zmiany, aby reszta aplikacji wyglądała tak, jak pokazano poniżej.
PO:
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)
W tym kodzie, które właśnie dodaliśmy, jest kilka kluczowych wywołań:
- Za
MainHandler.get
połączenie z numeremblobstore.create_upload_url
. To wywołanie generuje adres URL formularzaPOST
, wywołując moduł obsługi przesyłania w celu wysłania pliku do Blobstore. - Za
UploadHandler.post
połączenie z numeremblobstore_handlers.BlobstoreUploadHandler.get_uploads
. Na tym polega magia polegająca na umieszczeniu pliku w Blobstore i zwracaniu unikalnego, trwałego identyfikatora tego pliku –BlobKey
. - W
ViewBlobHandler.get
wywołanieblobstore_handlers.BlobstoreDownloadHandler.send
za pomocą funkcjiBlobKey
pliku powoduje pobranie pliku i przekazanie go do przeglądarki użytkownika
Połączenia te odpowiadają za większość korzystania z funkcji dodanych do aplikacji. Oto obrazowe przedstawienie tego drugiego i ostatniego zestawu zmian w elemencie main.py
:
Aktualizacja szablonu HTML
Niektóre aktualizacje głównej aplikacji wpływają na jej interfejs użytkownika, dlatego w szablonie internetowym musisz wprowadzić odpowiednie zmiany:
- Formularz przesyłania pliku jest wymagany z 3 elementami do wprowadzania danych: odpowiednio plikiem i 2 przyciskami przesyłania służącymi do przesyłania pliku i pomijaniu.
- Zaktualizuj dane wyjściowe dotyczące ostatnich wizyt, dodając „widok” link do wizyt z odpowiednim przesłaniem pliku lub „brak” w przeciwnym razie.
PRZED:
<!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>
Aby utworzyć zaktualizowany szablon, wprowadź zmiany z powyższej listy:
PO:
<!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>
Ten obraz przedstawia wymagane aktualizacje index.html
:
Ostatnia zmiana polega na tym, że Jinja2 preferuje swoje szablony w folderze templates
, więc utwórz ten folder i przenieś do niego index.html
. To już koniec wszystkich zmian niezbędnych do dodania Blobstore do przykładowej aplikacji w module 0.
(Opcjonalnie) Ulepszenie Cloud Storage
Pamięć masowa Blobstore przekształciła się w samą usługę Cloud Storage. Oznacza to, że dane przesłane do Blobstore są widoczne w konsoli Cloud, a w szczególności w przeglądarce Cloud Storage. Pytanie „gdzie?”. Odpowiedź to domyślny zasobnik Cloud Storage Twojej aplikacji App Engine. Jej nazwa to pełna nazwa domeny Twojej aplikacji App Engine – PROJECT_ID
.appspot.com
. To takie wygodne, bo wszystkie identyfikatory projektów są unikalne.
Aktualizacje przykładowej aplikacji usuwają przesłane pliki do tego zasobnika, ale deweloperzy mają możliwość wybrania bardziej szczegółowej lokalizacji. Domyślny zasobnik można uzyskać programowo w usłudze google.appengine.api.app_identity.get_default_gcs_bucket_name()
, dlatego jeśli chcesz uzyskać dostęp do tej wartości, musisz utworzyć nowy import, na przykład aby użyć go jako prefiksu do porządkowania przesłanych plików. Na przykład sortowanie według typu pliku:
Aby zastosować na przykład taki kod w przypadku obrazów, potrzebujesz kodu podobnego do tego i kodu, który sprawdza typy plików w celu wybrania żądanej nazwy zasobnika:
ROOT_BUCKET = app_identity.get_default_gcs_bucket_name()
IMAGE_BUCKET = '%s/%s' % (ROOT_BUCKET, 'images')
Możesz też zweryfikować przesłane obrazy za pomocą narzędzia takiego jak moduł imghdr
biblioteki standardowej w języku Python, aby potwierdzić typ obrazu. Warto też ograniczyć rozmiar przesyłanych plików na wypadek nieuczciwych podmiotów.
Powiedzmy, że to wszystko, co udało Ci się osiągnąć. Jak zaktualizować aplikację, aby umożliwić określenie, gdzie mają być przechowywane przesłane pliki? Kluczem jest dostosowanie wywołania funkcji blobstore.create_upload_url
w obiekcie MainHandler.get
, aby określić żądaną lokalizację w Cloud Storage do przesłania, dodając parametr gs_bucket_name
w następujący sposób:
blobstore.create_upload_url('/upload', gs_bucket_name=IMAGE_BUCKET))
Ta aktualizacja jest opcjonalna, jeśli chcesz określić, gdzie mają zostać przesłane pliki, dlatego nie jest ona częścią pliku main.py
w repozytorium. Zamiast tego w repozytorium będzie dostępna wersja alternatywna o nazwie main-gcs.py
. Zamiast używać osobnego „folderu” zasobnika, kod w main-gcs.py
przechowuje przesłane pliki w „katalogu głównym” (PROJECT_ID
.appspot.com
) tak jak main.py
, ale zapewnia rusztowanie potrzebne w przypadku uzyskania z próbki czegoś, co jest bardziej sugerowane w tej sekcji. Poniżej znajduje się ilustracja „różnic” od main.py
do main-gcs.py
.
6. Podsumowanie/Czyszczenie
W tej sekcji znajdziesz podsumowanie tego ćwiczenia w programie przez wdrożenie aplikacji oraz sprawdzenie, czy działa ona zgodnie z oczekiwaniami i we wszystkich uwzględnionych danych wyjściowych. Po sprawdzeniu aplikacji wykonaj czynności związane z czyszczeniem i zastanów się nad dalszymi czynnościami.
Wdróż i zweryfikuj aplikację
Wdróż ponownie aplikację za pomocą narzędzia gcloud app deploy
i sprawdź, czy działa zgodnie z reklamami, co zmienia się w zależności od wygody użytkowników (UX) aplikacji w porównaniu z aplikacją z modułu 0. Aplikacja zawiera teraz dwa różne ekrany. Pierwszy z nich to prompt z prośbą o przesłanie pliku z formularzem wizyty:
Następnie użytkownicy przesyłają plik i klikają „Prześlij”. lub kliknij „Pomiń” aby niczego nie przesyłać. W obu przypadkach wynikiem jest ekran ostatniej wizyty uzupełniony o opcję „widok”. linki lub „brak” między sygnaturami czasowymi wizyt a informacjami o użytkownikach:
Gratulujemy ukończenia tego ćwiczenia z programowania i dodania wykorzystania App Engine Blobstore do przykładowej aplikacji w module 0. Twój kod powinien być teraz zgodny z plikiem w folderze FINISH (Module 15). W tym folderze znajduje się również alternatywna wersja main-gcs.py
.
Czyszczenie danych
Ogólne
Jeśli na razie wszystko jest gotowe, wyłącz aplikację App Engine, aby uniknąć naliczania opłat. Jeśli jednak chcesz jeszcze bardziej przetestować lub poeksperymentować, platforma App Engine ma bezpłatny limit. Dopóki nie przekroczysz tego limitu, nie pobierzemy żadnych opłat. Oznacza to obliczenia, ale mogą być też naliczane opłaty za odpowiednie usługi App Engine. Więcej informacji znajdziesz na stronie z cennikiem. Jeśli ta migracja obejmuje inne usługi Cloud, są one rozliczane osobno. W obu przypadkach zapoznaj się z sekcją „Zapoznaj się z tymi ćwiczeniami”. sekcji poniżej.
Aby w pełni wyjaśnić wszystkie kwestie, wdrożenie na bezserwerowej platformie obliczeniowej Google Cloud, takiej jak App Engine, wiąże się z niewielkimi kosztami kompilacji i przechowywania danych. Cloud Build ma własny bezpłatny limit, podobnie jak Cloud Storage. Przechowywanie tego obrazu wykorzystuje część tego limitu. Możesz jednak mieszkać w regionie, w którym nie ma takiego poziomu bezpłatnego. Dlatego pamiętaj o wykorzystaniu miejsca na dane, aby zminimalizować potencjalne koszty. Określone „foldery” Cloud Storage należy sprawdzić m.in.:
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
- Powyższe linki do miejsca na dane zależą od Twoich danych
PROJECT_ID
oraz *LOC
*, np. „us
” jeśli aplikacja jest hostowana w Stanach Zjednoczonych.
Jeśli natomiast nie zamierzasz dalej korzystać z tej aplikacji lub innych powiązanych z nią ćwiczeń w Codelabs i chcesz całkowicie usunąć wszystko, zamknij projekt.
Powiązane z tym ćwiczeniam z programowania
Wymienione poniżej usługi są dostępne tylko w ramach tego ćwiczenia z programowania. Więcej informacji znajdziesz w dokumentacji poszczególnych usług:
- Usługa App Engine Blobstore podlega limitom i limitom przechowywanych danych, więc zapoznaj się z nimi oraz stroną z cennikiem starszych pakietów usług.
- Usługa App Engine Datastore jest świadczona przez Cloud Datastore (Cloud Firestore w trybie Datastore), który również ma poziom bezpłatny. więcej informacji znajdziesz na stronie z cennikiem.
Dalsze kroki
Kolejną migrację logiczną, którą należy rozważyć, omawiamy w module 16, w którym programiści mogą zobaczyć, jak przejść z usługi App Engine Blobstore na korzystanie z biblioteki klienta Cloud Storage. Korzyści z przejścia na wyższą wersję obejmują dostęp do większej liczby funkcji Cloud Storage oraz zapoznanie się z biblioteką klienta, która działa w przypadku aplikacji spoza App Engine, zarówno w Google Cloud, innych chmurach, jak i lokalnych. Jeśli uważasz, że nie potrzebujesz wszystkich funkcji dostępnych w Cloud Storage lub obawiasz się, jak wpłynie to na koszty, możesz pozostać przy App Engine Blobstore.
Poza modułem 16 jest mnóstwo innych możliwych migracji, takich jak Cloud NDB i Cloud Datastore, Cloud Tasks czy Cloud Memorystore. Dostępne są też migracje z różnych usług do Cloud Run i Cloud Functions. Repozytorium migracji zawiera wszystkie przykłady kodu oraz linki do wszystkich dostępnych ćwiczeń z programowania i filmów, a także wskazówki dotyczące migracji, które warto rozważyć, i wszelkie odpowiednie „zamówienia”. migracji danych.
7. Dodatkowe materiały
Problemy z ćwiczeniami w Codelabs/opinie
Jeśli podczas korzystania z tych ćwiczeń z programowania zauważysz jakiekolwiek problemy, najpierw je wyszukaj. Linki do wyszukiwania i tworzenia nowych problemów:
Zasoby migracji
Linki do folderów repozytorium w modułach 0 (START) i modułach 15 (FINISH) znajdziesz w tabeli poniżej. Dostęp do nich możesz też uzyskać z repozytorium wszystkich migracji z ćwiczeń z programowania App Engine, które możesz sklonować lub pobrać w postaci pliku ZIP.
Codelab | Python 2 | Python 3 |
Część 0. | Nie dotyczy | |
Moduł 15 (to ćwiczenie z programowania) | Nie dotyczy |
Zasoby online
Poniżej znajdują się zasoby online, które mogą być pomocne w przypadku tego samouczka:
App Engine
- Usługa Blobstore App Engine
- Limity danych przechowywanych w App Engine
- Dokumentacja App Engine
- Środowisko wykonawcze App Engine (środowisko standardowe) Pythona 2
- Korzystanie z wbudowanych bibliotek App Engine w Python 2 App Engine
- Informacje o cenach i limitach App Engine
- Wprowadzenie na rynek platformy App Engine drugiej generacji (2018)
- Porównanie pierwszych i platformy drugiej generacji
- Długoterminowa obsługa starszych środowisk wykonawczych
- Repozytorium z przykładami migracji dokumentacji
- Repozytorium z przykładami migracji dostarczonych przez społeczność
Google Cloud
- Python w Google Cloud Platform
- Biblioteki klienta Google Cloud Python
- Zawsze bezpłatne usługi Google Cloud typ
- Google Cloud SDK (narzędzie wiersza poleceń gcloud)
- Cała dokumentacja Google Cloud
Python
- Systemy szablonów Django i Jinja2
- Platforma internetowa
webapp2
- Dokumentacja
webapp2
- Połączenia z
webapp2_extras
- Dokumentacja
webapp2_extras
Jinja2
Filmy
- Stacja migracji bezserwerowej
- Ekspedycje bezserwerowe
- Zasubskrybuj Google Cloud Tech.
- Subskrybuj Google Developers.
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.