1. সংক্ষিপ্ত বিবরণ
সার্ভারলেস মাইগ্রেশন স্টেশন সিরিজের কোডল্যাব (স্ব-গতিসম্পন্ন, হাতে-কলমে টিউটোরিয়াল) এবং সম্পর্কিত ভিডিওগুলির লক্ষ্য হল গুগল ক্লাউড সার্ভারলেস ডেভেলপারদের তাদের অ্যাপ্লিকেশনগুলিকে আধুনিকীকরণে সাহায্য করা, এক বা একাধিক মাইগ্রেশনের মাধ্যমে, প্রাথমিকভাবে লিগ্যাসি পরিষেবাগুলি থেকে দূরে সরে যাওয়ার মাধ্যমে। এটি আপনার অ্যাপগুলিকে আরও পোর্টেবল করে তোলে এবং আপনাকে আরও বিকল্প এবং নমনীয়তা দেয়, যা আপনাকে ক্লাউড পণ্যের বিস্তৃত পরিসরের সাথে একীভূত করতে এবং অ্যাক্সেস করতে এবং আরও সহজেই নতুন ভাষার রিলিজে আপগ্রেড করতে সক্ষম করে। প্রাথমিকভাবে প্রাথমিক ক্লাউড ব্যবহারকারীদের উপর, মূলত অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) ডেভেলপারদের উপর ফোকাস করার সময়, এই সিরিজটি ক্লাউড ফাংশন এবং ক্লাউড রানের মতো অন্যান্য সার্ভারলেস প্ল্যাটফর্ম, অথবা প্রযোজ্য ক্ষেত্রে অন্য কোথাও অন্তর্ভুক্ত করার জন্য যথেষ্ট বিস্তৃত।
এই মডিউল ১৫ কোডল্যাবটি ব্যাখ্যা করে যে কীভাবে মডিউল ০ থেকে নমুনা অ্যাপে অ্যাপ ইঞ্জিন blobstore ব্যবহার যোগ করতে হয়। তারপর আপনি মডিউল ১৬-তে পরবর্তী সময়ে ক্লাউড স্টোরেজে সেই ব্যবহার স্থানান্তর করতে প্রস্তুত থাকবেন।
তুমি শিখবে কিভাবে
- অ্যাপ ইঞ্জিন ব্লবস্টোর এপিআই/লাইব্রেরির ব্যবহার যোগ করুন
- ব্যবহারকারীর আপলোডগুলি
blobstoreপরিষেবাতে সংরক্ষণ করুন - ক্লাউড স্টোরেজে স্থানান্তরের পরবর্তী পদক্ষেপের জন্য প্রস্তুত হন
তোমার যা লাগবে
- একটি সক্রিয় GCP বিলিং অ্যাকাউন্ট সহ একটি Google ক্লাউড প্ল্যাটফর্ম প্রকল্প
- পাইথনের মৌলিক দক্ষতা
- সাধারণ লিনাক্স কমান্ডের কার্যকরী জ্ঞান
- অ্যাপ ইঞ্জিন অ্যাপ তৈরি এবং স্থাপনের প্রাথমিক জ্ঞান।
- একটি কার্যকরী মডিউল 0 অ্যাপ ইঞ্জিন অ্যাপ (রেপো থেকে পান)
জরিপ
আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?
পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
গুগল ক্লাউড পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
2. পটভূমি
অ্যাপ ইঞ্জিন ব্লবস্টোর এপিআই থেকে মাইগ্রেট করার জন্য, মডিউল 0 থেকে বিদ্যমান বেসলাইন অ্যাপ ইঞ্জিন ndb অ্যাপে এর ব্যবহার যোগ করুন। নমুনা অ্যাপটি ব্যবহারকারীর সাম্প্রতিক দশটি ভিজিট প্রদর্শন করে। আমরা অ্যাপটি পরিবর্তন করছি যাতে ব্যবহারকারীকে তাদের "ভিজিট" এর সাথে সঙ্গতিপূর্ণ একটি আর্টিফ্যাক্ট (একটি ফাইল) আপলোড করতে বলা হয়। ব্যবহারকারী যদি তা করতে না চান, তাহলে "স্কিপ" বিকল্প রয়েছে। ব্যবহারকারীর সিদ্ধান্ত যাই হোক না কেন, পরবর্তী পৃষ্ঠাটি মডিউল 0 (এবং এই সিরিজের অন্যান্য অনেক মডিউল) থেকে অ্যাপের মতো একই আউটপুট রেন্ডার করে। এই অ্যাপ ইঞ্জিন blobstore ইন্টিগ্রেশন বাস্তবায়িত হওয়ার সাথে সাথে, আমরা পরবর্তী (মডিউল 16) কোডল্যাবে এটিকে ক্লাউড স্টোরেজে স্থানান্তর করতে পারি।
অ্যাপ ইঞ্জিন জ্যাঙ্গো এবং জিনজা২ টেমপ্লেটিং সিস্টেমে অ্যাক্সেস প্রদান করে, এবং একটি জিনিস যা এই উদাহরণটিকে আলাদা করে তোলে (ব্লবস্টোর অ্যাক্সেস যোগ করা ছাড়াও) তা হল এটি মডিউল 0-এ জ্যাঙ্গো ব্যবহার থেকে মডিউল 15-এ জিনজা২-তে স্যুইচ করে। অ্যাপ ইঞ্জিন অ্যাপগুলিকে আধুনিকীকরণের একটি গুরুত্বপূর্ণ পদক্ষেপ হল ওয়েব ফ্রেমওয়ার্কগুলিকে webapp2 থেকে ফ্লাস্কে স্থানান্তর করা। পরবর্তীটি তার ডিফল্ট টেমপ্লেটিং সিস্টেম হিসাবে জিনজা২ ব্যবহার করে, তাই আমরা ব্লবস্টোর অ্যাক্সেসের জন্য webapp2 এ থাকাকালীন জিনজা২ বাস্তবায়ন করে সেই দিকে অগ্রসর হতে শুরু করি। যেহেতু ফ্লাস্ক ডিফল্টরূপে জিনজা২ ব্যবহার করে, এর অর্থ হল মডিউল 16-এ টেমপ্লেটে কোনও পরিবর্তনের প্রয়োজন হবে না।
৩. সেটআপ/প্রিওয়ার্ক
টিউটোরিয়ালের মূল অংশে পৌঁছানোর আগে, আপনার প্রকল্পটি সেট আপ করুন, কোডটি পান এবং কার্যকরী কোড দিয়ে শুরু করার জন্য বেসলাইন অ্যাপটি স্থাপন করুন।
১. সেটআপ প্রকল্প
যদি আপনি ইতিমধ্যেই মডিউল 0 অ্যাপটি ব্যবহার করে থাকেন, তাহলে আমরা একই প্রকল্প (এবং কোড) পুনরায় ব্যবহার করার পরামর্শ দিচ্ছি। বিকল্পভাবে, আপনি একটি নতুন প্রকল্প তৈরি করতে পারেন অথবা অন্য একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করতে পারেন। নিশ্চিত করুন যে প্রকল্পটির একটি সক্রিয় বিলিং অ্যাকাউন্ট আছে এবং অ্যাপ ইঞ্জিন সক্রিয় আছে।
2. বেসলাইন নমুনা অ্যাপ পান
এই কোডল্যাবের পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 0 নমুনা অ্যাপ থাকা। যদি আপনার কাছে এটি না থাকে, তাহলে আপনি এটি মডিউল 0 "START" ফোল্ডার থেকে পেতে পারেন (নীচের লিঙ্ক)। এই কোডল্যাব আপনাকে প্রতিটি ধাপে নিয়ে যাবে, এবং শেষ পর্যন্ত এমন কোড দিয়ে শেষ করবে যা মডিউল 15 "FINISH" ফোল্ডারের সাথে সাদৃশ্যপূর্ণ।
- শুরু: মডিউল 0 ফোল্ডার (পাইথন 2)
- শেষ: মডিউল ১৫ ফোল্ডার (পাইথন ২)
- সম্পূর্ণ রেপো ( জিপ ফাইল ক্লোন বা ডাউনলোড করতে)
মডিউল 0 স্টার্টিং ফাইলের ডিরেক্টরিটি এইরকম দেখাবে:
$ ls README.md index.html app.yaml main.py
৩. (পুনরায়) বেসলাইন অ্যাপ স্থাপন করুন
আপনার এখন কার্যকর করার জন্য বাকি প্রিওয়ার্ক ধাপগুলি:
-
gcloudকমান্ড-লাইন টুলের সাথে নিজেকে পুনরায় পরিচিত করুন। -
gcloud app deployমাধ্যমে নমুনা অ্যাপটি পুনরায় ডিপ্লয় করুন - অ্যাপ ইঞ্জিনে কোনও সমস্যা ছাড়াই অ্যাপটি চলছে কিনা তা নিশ্চিত করুন।
একবার আপনি এই ধাপগুলি সফলভাবে সম্পন্ন করার পরে এবং আপনার ওয়েব অ্যাপটি কাজ করছে (নীচের চিত্রের মতো আউটপুট সহ) দেখতে পেলে, আপনি আপনার অ্যাপে ক্যাশিং ব্যবহার যোগ করতে প্রস্তুত।

৪. কনফিগারেশন ফাইল আপডেট করুন
অ্যাপ.ইয়ামল
অ্যাপ্লিকেশন কনফিগারেশনে কোনও গুরুত্বপূর্ণ পরিবর্তন নেই, তবে যেমনটি আগে উল্লেখ করা হয়েছে, আমরা Django templating (ডিফল্ট) থেকে Jinja2-তে স্থানান্তরিত হচ্ছি, তাই স্যুইচ করার জন্য, ব্যবহারকারীদের App Engine সার্ভারে উপলব্ধ Jinja2-এর সর্বশেষ সংস্করণটি নির্দিষ্ট করতে হবে এবং আপনি এটি app.yaml এর বিল্ট-ইন 3rd-party লাইব্রেরি বিভাগে যুক্ত করে করতে পারেন।
আগে:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
আপনার app.yaml ফাইলটি সম্পাদনা করার জন্য এখানে দেখুন এমন একটি নতুন libraries বিভাগ যোগ করুন:
পরে:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
অন্য কোন কনফিগারেশন ফাইল আপডেট করার প্রয়োজন নেই, তাই আসুন অ্যাপ্লিকেশন ফাইলগুলিতে এগিয়ে যাই।
৫. অ্যাপ্লিকেশন ফাইলগুলি পরিবর্তন করুন
আমদানি এবং জিনজা২ সাপোর্ট
main.py এর প্রথম পরিবর্তনগুলির মধ্যে রয়েছে Blobstore API-এর ব্যবহার যোগ করা এবং Django templating-কে Jinja2 দিয়ে প্রতিস্থাপন করা। এখানে কী পরিবর্তন হচ্ছে তা দেওয়া হল:
-
osমডিউলের উদ্দেশ্য হল একটি Django টেমপ্লেটের জন্য একটি ফাইল পাথনেম তৈরি করা। যেহেতু আমরা Jinja2 তে স্যুইচ করছি যেখানে এটি পরিচালনা করা হয়, তাইosএবং Django টেমপ্লেট রেন্ডারার,google.appengine.ext.webapp.template, ব্যবহারের আর প্রয়োজন নেই, তাই সেগুলি সরানো হচ্ছে। - Blobstore API আমদানি করুন:
google.appengine.ext.blobstore - মূল
webappফ্রেমওয়ার্কে পাওয়া ব্লবস্টোর হ্যান্ডলারগুলি আমদানি করুন—এগুলিwebapp2এ উপলব্ধ নয়:google.appengine.ext.webapp.blobstore_handlers -
webapp2_extrasপ্যাকেজ থেকে Jinja2 সাপোর্ট আমদানি করুন
আগে:
import os
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template
উপরের তালিকার পরিবর্তনগুলি main.py তে বর্তমান আমদানি বিভাগটি নীচের কোড স্নিপেট দিয়ে প্রতিস্থাপন করে বাস্তবায়ন করুন।
পরে:
import webapp2
from webapp2_extras import jinja2
from google.appengine.ext import blobstore, ndb
from google.appengine.ext.webapp import blobstore_handlers
আমদানির পরে, webapp2_extras ডক্সে সংজ্ঞায়িত Jinja2 ব্যবহার সমর্থন করার জন্য কিছু বয়লারপ্লেট কোড যোগ করুন। নিম্নলিখিত কোড স্নিপেটটি Jinja2 কার্যকারিতা সহ স্ট্যান্ডার্ড webapp2 অনুরোধ হ্যান্ডলার ক্লাসকে মোড়ানো করে, তাই আমদানির ঠিক পরেই এই কোড ব্লকটি main.py তে যুক্ত করুন:
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))
ব্লবস্টোর সাপোর্ট যোগ করুন
এই সিরিজের অন্যান্য মাইগ্রেশনের বিপরীতে যেখানে আমরা নমুনা অ্যাপের কার্যকারিতা বা আউটপুটকে UX-তে (খুব বেশি) পরিবর্তন না করে অভিন্ন (অথবা প্রায় একই) রাখি, এই উদাহরণটি আদর্শ থেকে আরও আমূল প্রস্থান করে। সাম্প্রতিক দশটি ভিজিট প্রদর্শনের পরে তাৎক্ষণিকভাবে একটি নতুন ভিজিট নিবন্ধন করার পরিবর্তে, আমরা অ্যাপটি আপডেট করছি যাতে ব্যবহারকারীর কাছে তাদের ভিজিট নিবন্ধনের জন্য একটি ফাইল আর্টিফ্যাক্ট চাওয়া হয়। এরপর ব্যবহারকারীরা হয় একটি সংশ্লিষ্ট ফাইল আপলোড করতে পারেন অথবা "এড়িয়ে যান" নির্বাচন করতে পারেন যাতে কিছু আপলোড না হয়। এই ধাপটি সম্পূর্ণ হয়ে গেলে, "সর্বশেষ ভিজিট" পৃষ্ঠাটি প্রদর্শিত হবে।
এই পরিবর্তনের ফলে আমাদের অ্যাপটি Blobstore পরিষেবা ব্যবহার করে সেই ছবি বা অন্যান্য ফাইল টাইপ সাম্প্রতিক ভিজিট পৃষ্ঠায় সংরক্ষণ করতে (এবং সম্ভবত পরে রেন্ডার করতে) সক্ষম হবে।
ডেটা মডেল আপডেট করুন এবং এর ব্যবহার বাস্তবায়ন করুন
আমরা আরও ডেটা সংরক্ষণ করছি, বিশেষ করে Blobstore-এ আপলোড করা ফাইলের ID (যাকে " BlobKey " বলা হয়) সংরক্ষণ করার জন্য ডেটা মডেল আপডেট করছি এবং store_visit() এ সংরক্ষণ করার জন্য একটি রেফারেন্স যোগ করছি। যেহেতু এই অতিরিক্ত ডেটা কোয়েরির সময় অন্য সবকিছুর সাথে ফেরত পাঠানো হয়, fetch_visits() একই থাকে।
file_blob এবং ndb.BlobKeyProperty সমন্বিত এই আপডেটগুলির আগে এবং পরে এখানে দেওয়া হল:
আগে:
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)
পরে:
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)
এখন পর্যন্ত যে পরিবর্তনগুলি করা হয়েছে তার একটি চিত্রিত উপস্থাপনা এখানে দেওয়া হল:

ফাইল আপলোড সমর্থন করে
কার্যকারিতার সবচেয়ে উল্লেখযোগ্য পরিবর্তন হল ফাইল আপলোড সমর্থন করা, ব্যবহারকারীকে ফাইলের জন্য অনুরোধ করা হোক, "স্কিপ" বৈশিষ্ট্য সমর্থন করা হোক, অথবা ভিজিটের সাথে সম্পর্কিত ফাইল রেন্ডার করা হোক। এগুলি সবই ছবির অংশ। ফাইল আপলোড সমর্থন করার জন্য প্রয়োজনীয় পরিবর্তনগুলি হল:
- প্রধান হ্যান্ডলার
GETঅনুরোধটি আর সাম্প্রতিক ভিজিটগুলি প্রদর্শনের জন্য আনে না। পরিবর্তে, এটি ব্যবহারকারীকে আপলোডের জন্য অনুরোধ করে। - যখন একজন শেষ-ব্যবহারকারী আপলোড করার জন্য একটি ফাইল জমা দেন বা সেই প্রক্রিয়াটি এড়িয়ে যান, তখন ফর্ম থেকে একটি
POSTনতুনUploadHandlerকে নিয়ন্ত্রণ হস্তান্তর করে, যাgoogle.appengine.ext.webapp.blobstore_handlers.BlobstoreUploadHandlerথেকে প্রাপ্ত। -
UploadHandlerএরPOSTপদ্ধতি আপলোড সম্পাদন করে, ভিজিট নিবন্ধন করতেstore_visit()কল করে এবং ব্যবহারকারীকে "/" এ ফেরত পাঠানোর জন্য একটি HTTP 307 পুনঃনির্দেশনা ট্রিগার করে, যেখানে... - প্রধান হ্যান্ডলারের
POSTপদ্ধতি (fetch_visits()এর মাধ্যমে) অনুসন্ধান করে এবং সাম্প্রতিক ভিজিটগুলি প্রদর্শন করে। ব্যবহারকারী যদি "skip" নির্বাচন করেন, তাহলে কোনও ফাইল আপলোড করা হয় না, তবে ভিজিটটি এখনও নিবন্ধিত থাকে এবং একই পুনঃনির্দেশনা অনুসরণ করে। - সাম্প্রতিক ভিজিট ডিসপ্লেতে ব্যবহারকারীর জন্য একটি নতুন ক্ষেত্র প্রদর্শিত হয়, হয় একটি হাইপারলিঙ্কযুক্ত "ভিউ" যদি একটি আপলোড ফাইল উপলব্ধ থাকে অথবা "কিছুই নয়"। এই পরিবর্তনগুলি HTML টেমপ্লেটে একটি আপলোড ফর্ম যোগ করার সাথে সাথে বাস্তবায়িত হয় (এ সম্পর্কে আরও শীঘ্রই আসছে)।
- যদি কোনও ব্যবহারকারী আপলোড করা ভিডিও সহ কোনও ভিজিটের জন্য "ভিউ" লিঙ্কে ক্লিক করেন, তাহলে এটি
google.appengine.ext.webapp.blobstore_handlers.BlobstoreDownloadHandlerথেকে প্রাপ্ত একটি নতুনViewBlobHandlerএ একটিGETঅনুরোধ পাঠায়, হয় ফাইলটিকে একটি চিত্র হিসাবে রেন্ডার করে (যদি সমর্থিত হয় তবে ব্রাউজারে), যদি না থাকে তবে ডাউনলোড করার অনুরোধ করে, অথবা যদি না পাওয়া যায় তবে HTTP 404 ত্রুটি ফেরত দেয়। - নতুন জোড়া হ্যান্ডলার ক্লাস এবং তাদের কাছে ট্র্যাফিক পাঠানোর জন্য নতুন জোড়া রুট ছাড়াও, উপরে বর্ণিত 307 পুনঃনির্দেশনা গ্রহণ করার জন্য প্রধান হ্যান্ডলারের একটি নতুন
POSTপদ্ধতি প্রয়োজন।
এই আপডেটগুলির আগে, মডিউল 0 অ্যাপটিতে শুধুমাত্র একটি GET পদ্ধতি এবং একটি একক রুট সহ একটি প্রধান হ্যান্ডলার ছিল:
আগে:
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)
এই আপডেটগুলি বাস্তবায়িত হওয়ার সাথে সাথে, এখন তিনটি হ্যান্ডলার রয়েছে: ১) POST পদ্ধতি সহ আপলোড হ্যান্ডলার, ২) GET পদ্ধতি সহ একটি "ভিউ ব্লব" ডাউনলোড হ্যান্ডলার এবং ৩) GET এবং POST পদ্ধতি সহ প্রধান হ্যান্ডলার। এই পরিবর্তনগুলি করুন যাতে আপনার অ্যাপের বাকি অংশ এখন নীচের মতো দেখায়।
পরে:
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)
আমরা এইমাত্র যোগ করা এই কোডটিতে বেশ কয়েকটি মূল কল রয়েছে:
-
MainHandler.getতে,blobstore.create_upload_urlএ একটি কল আছে। এই কলটিPOSTযে ফর্মে আছে সেই URL টি তৈরি করে, যা আপলোড হ্যান্ডলারকে Blobstore এ ফাইলটি পাঠাতে বলে। -
UploadHandler.postএ,blobstore_handlers.BlobstoreUploadHandler.get_uploadsএ একটি কল আছে। এটিই আসল জাদু যা ফাইলটিকে Blobstore এ রাখে এবং সেই ফাইলের জন্য একটি অনন্য এবং স্থায়ী আইডি, এটিরBlobKey, ফেরত দেয়। -
ViewBlobHandler.getতে,blobstore_handlers.BlobstoreDownloadHandler.sendকে একটি ফাইলেরBlobKeyদিয়ে কল করার ফলে ফাইলটি আনা হয় এবং শেষ ব্যবহারকারীর ব্রাউজারে ফরোয়ার্ড করা হয়।
এই কলগুলি অ্যাপে যোগ করা বৈশিষ্ট্যগুলি অ্যাক্সেস করার বেশিরভাগ অংশকে প্রতিনিধিত্ব করে। main.py তে এই দ্বিতীয় এবং চূড়ান্ত পরিবর্তনগুলির একটি চিত্রিত উপস্থাপনা এখানে দেওয়া হল:

HTML টেমপ্লেট আপডেট করুন
মূল অ্যাপ্লিকেশনের কিছু আপডেট অ্যাপের ইউজার ইন্টারফেস (UI) কে প্রভাবিত করে, তাই ওয়েব টেমপ্লেটে সংশ্লিষ্ট পরিবর্তন প্রয়োজন, আসলে দুটি:
- ৩টি ইনপুট উপাদান সহ একটি ফাইল আপলোড ফর্ম প্রয়োজন: ফাইল আপলোড এবং স্কিপ করার জন্য যথাক্রমে একটি ফাইল এবং দুটি সাবমিট বোতাম।
- সাম্প্রতিক ভিজিট আউটপুট আপডেট করার জন্য, সংশ্লিষ্ট ফাইল আপলোড সহ ভিজিটের জন্য একটি "ভিউ" লিঙ্ক যোগ করুন অথবা অন্যথায় "কিছুই নয়" লিঙ্ক যোগ করুন।
আগে:
<!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>
আপডেট করা টেমপ্লেটটি অন্তর্ভুক্ত করার জন্য উপরের তালিকার পরিবর্তনগুলি বাস্তবায়ন করুন:
পরে:
<!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>
এই ছবিটি index.html এর প্রয়োজনীয় আপডেটগুলি দেখায়:

একটি চূড়ান্ত পরিবর্তন হল যে Jinja2 তার টেমপ্লেটগুলিকে একটি templates ফোল্ডারে পছন্দ করে, তাই সেই ফোল্ডারটি তৈরি করুন এবং এর ভিতরে index.html সরান। এই চূড়ান্ত পদক্ষেপের মাধ্যমে, আপনি এখন মডিউল 0 নমুনা অ্যাপে Blobstore ব্যবহার যোগ করার জন্য প্রয়োজনীয় সমস্ত পরিবর্তন সম্পন্ন করেছেন।
(ঐচ্ছিক) ক্লাউড স্টোরেজ "বর্ধিতকরণ"
ব্লবস্টোর স্টোরেজ অবশেষে ক্লাউড স্টোরেজে রূপান্তরিত হয়। এর অর্থ হল ব্লবস্টোর আপলোডগুলি ক্লাউড কনসোলে, বিশেষ করে ক্লাউড স্টোরেজ ব্রাউজারে দৃশ্যমান। প্রশ্ন হল কোথায়। উত্তর হল আপনার অ্যাপ ইঞ্জিন অ্যাপের ডিফল্ট ক্লাউড স্টোরেজ বাকেট। এর নাম হল আপনার অ্যাপ ইঞ্জিন অ্যাপের সম্পূর্ণ ডোমেন নাম, PROJECT_ID .appspot.com নাম। এটি এত সুবিধাজনক কারণ সমস্ত প্রকল্প আইডি অনন্য, তাই না?
নমুনা অ্যাপ্লিকেশনে করা আপডেটগুলি আপলোড করা ফাইলগুলিকে সেই বাকেটে ফেলে দেয়, তবে ডেভেলপারদের কাছে আরও নির্দিষ্ট অবস্থান বেছে নেওয়ার বিকল্প থাকে। ডিফল্ট বাকেটটি google.appengine.api.app_identity.get_default_gcs_bucket_name() এর মাধ্যমে প্রোগ্রাম্যাটিকভাবে অ্যাক্সেসযোগ্য, যদি আপনি এই মানটি অ্যাক্সেস করতে চান, ধরুন আপলোড করা ফাইলগুলি সংগঠিত করার জন্য একটি উপসর্গ হিসাবে ব্যবহার করতে চান তবে একটি নতুন আমদানি প্রয়োজন। উদাহরণস্বরূপ, ফাইলের ধরণ অনুসারে বাছাই করা:

উদাহরণস্বরূপ, ছবির জন্য এরকম কিছু বাস্তবায়ন করতে, আপনার কাছে এই ধরণের কোড থাকবে এবং কিছু কোড থাকবে যা পছন্দসই বাকেটের নাম নির্বাচন করার জন্য ফাইলের ধরণ পরীক্ষা করবে:
ROOT_BUCKET = app_identity.get_default_gcs_bucket_name()
IMAGE_BUCKET = '%s/%s' % (ROOT_BUCKET, 'images')
আপনি ছবির ধরণ নিশ্চিত করার জন্য পাইথন স্ট্যান্ডার্ড লাইব্রেরি imghdr মডিউলের মতো একটি টুল ব্যবহার করে আপলোড করা ছবিগুলিকে যাচাই করতে পারবেন। অবশেষে, খারাপ অভিনেতাদের ক্ষেত্রে আপনি সম্ভবত আপলোডের আকার সীমিত করতে চাইবেন।
ধরা যাক, সব করা হয়েছে। আপলোড করা ফাইলগুলো কোথায় সংরক্ষণ করতে হবে তা নির্দিষ্ট করার জন্য আমরা কীভাবে আমাদের অ্যাপটি আপডেট করতে পারি? মূল কথা হল MainHandler.get এ blobstore.create_upload_url এ কলটি পরিবর্তন করা। gs_bucket_name প্যারামিটারটি এভাবে যোগ করে আপলোডের জন্য ক্লাউড স্টোরেজে পছন্দসই অবস্থান নির্দিষ্ট করতে হবে:
blobstore.create_upload_url('/upload', gs_bucket_name=IMAGE_BUCKET))
যেহেতু আপলোডগুলি কোথায় যাবে তা নির্দিষ্ট করতে চাইলে এটি একটি ঐচ্ছিক আপডেট, তাই এটি রেপোতে main.py ফাইলের অংশ নয়। পরিবর্তে, repo-তে আপনার পর্যালোচনার জন্য main-gcs.py নামে একটি বিকল্প উপলব্ধ। একটি পৃথক বাকেট "ফোল্ডার" ব্যবহার করার পরিবর্তে, main-gcs.py এর কোডটি main.py মতো "root" বাকেট ( PROJECT_ID .appspot.com ) এ আপলোডগুলি সংরক্ষণ করে তবে এই বিভাগে ইঙ্গিত করা হয়েছে যে আপনি যদি নমুনাটি আরও কিছুতে রূপান্তর করতে চান তবে আপনার প্রয়োজনীয় স্ক্যাফোল্ডিং সরবরাহ করে। নীচে main.py এবং main-gcs.py মধ্যে "পার্থক্য" এর একটি চিত্রণ দেওয়া হল।

৬. সারাংশ/পরিষ্কারকরণ
এই বিভাগটি অ্যাপটি স্থাপন করে, এটি উদ্দেশ্য অনুসারে কাজ করে এবং যেকোনো প্রতিফলিত আউটপুটে যাচাই করে এই কোডল্যাবটি শেষ করে। অ্যাপ যাচাইকরণের পরে, যেকোনো পরিষ্কার-পরিচ্ছন্নতার পদক্ষেপগুলি সম্পাদন করুন এবং পরবর্তী পদক্ষেপগুলি বিবেচনা করুন।
অ্যাপ্লিকেশন স্থাপন এবং যাচাই করুন
gcloud app deploy দিয়ে আপনার অ্যাপটি পুনরায় স্থাপন করুন, এবং নিশ্চিত করুন যে অ্যাপটি বিজ্ঞাপন অনুসারে কাজ করে, ব্যবহারকারীর অভিজ্ঞতা (UX) মডিউল 0 অ্যাপ থেকে আলাদা। আপনার অ্যাপে এখন দুটি ভিন্ন স্ক্রিন রয়েছে, প্রথমটি হল ভিজিট ফাইল আপলোড ফর্ম প্রম্পট:
সেখান থেকে, ব্যবহারকারীরা হয় একটি ফাইল আপলোড করে "জমা দিন" এ ক্লিক করে অথবা "এড়িয়ে যান" এ ক্লিক করে কিছু আপলোড না করে। উভয় ক্ষেত্রেই, ফলাফল হল সাম্প্রতিক ভিজিট স্ক্রিন, যা এখন "দেখুন" লিঙ্ক দিয়ে বাড়ানো হয়েছে অথবা ভিজিট টাইমস্ট্যাম্প এবং ভিজিটর তথ্যের মধ্যে "কিছুই নয়":

মডিউল 0 নমুনা অ্যাপে অ্যাপ ইঞ্জিন ব্লবস্টোর ব্যবহার যোগ করে এই কোডল্যাবটি সম্পূর্ণ করার জন্য অভিনন্দন। আপনার কোডটি এখন FINISH (মডিউল 15) ফোল্ডারের সাথে মিলবে। বিকল্প main-gcs.py ও সেই ফোল্ডারে উপস্থিত রয়েছে।
পরিষ্কার করা
সাধারণ
যদি এখনকার মতো কাজ শেষ হয়ে যায়, তাহলে বিলিং এড়াতে আমরা আপনাকে আপনার অ্যাপ ইঞ্জিন অ্যাপটি অক্ষম করার পরামর্শ দিচ্ছি। তবে আপনি যদি আরও কিছু পরীক্ষা বা পরীক্ষা করতে চান, তাহলে অ্যাপ ইঞ্জিন প্ল্যাটফর্মের একটি বিনামূল্যের কোটা আছে, এবং যতক্ষণ না আপনি সেই ব্যবহারের স্তর অতিক্রম করেন, ততক্ষণ আপনাকে চার্জ করা উচিত নয়। এটি গণনার জন্য, তবে প্রাসঙ্গিক অ্যাপ ইঞ্জিন পরিষেবাগুলির জন্যও চার্জ হতে পারে, তাই আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন। যদি এই মাইগ্রেশনে অন্যান্য ক্লাউড পরিষেবা জড়িত থাকে, তবে সেগুলি আলাদাভাবে বিল করা হয়। উভয় ক্ষেত্রেই, প্রযোজ্য হলে, নীচের "এই কোডল্যাবের জন্য নির্দিষ্ট" বিভাগটি দেখুন।
সম্পূর্ণ প্রকাশের জন্য, অ্যাপ ইঞ্জিনের মতো গুগল ক্লাউড সার্ভারলেস কম্পিউট প্ল্যাটফর্মে স্থাপনের জন্য সামান্য বিল্ড এবং স্টোরেজ খরচ হয়। ক্লাউড স্টোরেজের মতো ক্লাউড বিল্ডেরও নিজস্ব ফ্রি কোটা রয়েছে। সেই ছবির স্টোরেজ সেই কোটার কিছু অংশ ব্যবহার করে। তবে, আপনি এমন একটি অঞ্চলে বাস করতে পারেন যেখানে এই ধরণের ফ্রি টিয়ার নেই, তাই সম্ভাব্য খরচ কমাতে আপনার স্টোরেজ ব্যবহার সম্পর্কে সচেতন থাকুন। আপনার পর্যালোচনা করা উচিত এমন নির্দিষ্ট ক্লাউড স্টোরেজ "ফোল্ডার"গুলির মধ্যে রয়েছে:
-
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 - উপরের স্টোরেজ লিঙ্কগুলি আপনার
PROJECT_IDএবং *LOC*ation এর উপর নির্ভর করে, উদাহরণস্বরূপ, "us" যদি আপনার অ্যাপটি মার্কিন যুক্তরাষ্ট্রে হোস্ট করা হয়।
অন্যদিকে, যদি আপনি এই অ্যাপ্লিকেশন বা অন্যান্য সম্পর্কিত মাইগ্রেশন কোডল্যাবগুলি চালিয়ে যেতে না চান এবং সবকিছু সম্পূর্ণরূপে মুছে ফেলতে চান, তাহলে আপনার প্রকল্পটি বন্ধ করে দিন ।
এই কোডল্যাবের জন্য নির্দিষ্ট
নীচে তালিকাভুক্ত পরিষেবাগুলি এই কোডল্যাবের জন্য অনন্য। আরও তথ্যের জন্য প্রতিটি পণ্যের ডকুমেন্টেশন দেখুন:
- অ্যাপ ইঞ্জিন ব্লবস্টোর পরিষেবাটি স্টোরড ডেটা কোটা এবং সীমার মধ্যে পড়ে, তাই এটি পর্যালোচনা করুন এবং লিগ্যাসি বান্ডলড পরিষেবাগুলির মূল্য পৃষ্ঠাটিও পর্যালোচনা করুন।
- অ্যাপ ইঞ্জিন ডেটাস্টোর পরিষেবাটি ক্লাউড ডেটাস্টোর (ডেটাস্টোর মোডে ক্লাউড ফায়ারস্টোর) দ্বারা সরবরাহ করা হয় যার একটি বিনামূল্যের স্তরও রয়েছে; আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন।
পরবর্তী পদক্ষেপ
পরবর্তী যৌক্তিক মাইগ্রেশনটি বিবেচনা করার জন্য মডিউল ১৬-তে আলোচনা করা হয়েছে, যেখানে ডেভেলপারদের দেখানো হয়েছে কিভাবে অ্যাপ ইঞ্জিন ব্লবস্টোর পরিষেবা থেকে ক্লাউড স্টোরেজ ক্লায়েন্ট লাইব্রেরি ব্যবহারে স্থানান্তর করতে হয়। আপগ্রেড করার সুবিধাগুলির মধ্যে রয়েছে আরও ক্লাউড স্টোরেজ বৈশিষ্ট্য অ্যাক্সেস করতে সক্ষম হওয়া, এমন একটি ক্লায়েন্ট লাইব্রেরির সাথে পরিচিত হওয়া যা অ্যাপ ইঞ্জিনের বাইরের অ্যাপগুলির জন্য কাজ করে, তা সে গুগল ক্লাউড, অন্যান্য ক্লাউড, এমনকি অন-প্রিমিসেই হোক। যদি আপনার মনে হয় যে ক্লাউড স্টোরেজ থেকে উপলব্ধ সমস্ত বৈশিষ্ট্য আপনার প্রয়োজন না হয় বা খরচের উপর এর প্রভাব সম্পর্কে উদ্বিগ্ন হন, তাহলে আপনি অ্যাপ ইঞ্জিন ব্লবস্টোরে থাকতে পারেন।
বিয়ন্ড মডিউল ১৬-তে ক্লাউড এনডিবি এবং ক্লাউড ডেটাস্টোর, ক্লাউড টাস্ক, অথবা ক্লাউড মেমোরিস্টোরের মতো আরও অনেক সম্ভাব্য মাইগ্রেশন রয়েছে। ক্লাউড রান এবং ক্লাউড ফাংশনে ক্রস-প্রোডাক্ট মাইগ্রেশনও রয়েছে। মাইগ্রেশন রেপোতে সমস্ত কোড নমুনা রয়েছে, আপনাকে উপলব্ধ সমস্ত কোডল্যাব এবং ভিডিওর সাথে লিঙ্ক করা হয়েছে এবং কোন মাইগ্রেশনগুলি বিবেচনা করতে হবে এবং মাইগ্রেশনের কোনও প্রাসঙ্গিক "ক্রম" সম্পর্কে নির্দেশিকাও প্রদান করা হয়েছে।
৭. অতিরিক্ত সম্পদ
কোডল্যাব সমস্যা/প্রতিক্রিয়া
এই কোডল্যাবে যদি কোনও সমস্যা খুঁজে পান, তাহলে ফাইল করার আগে অনুগ্রহ করে প্রথমে আপনার সমস্যাটি অনুসন্ধান করুন। নতুন সমস্যা অনুসন্ধান এবং তৈরি করার লিঙ্ক:
মাইগ্রেশন রিসোর্স
মডিউল 0 (START) এবং মডিউল 15 (FINISH) এর জন্য রেপো ফোল্ডারগুলির লিঙ্কগুলি নীচের টেবিলে পাওয়া যাবে। সমস্ত অ্যাপ ইঞ্জিন কোডল্যাব মাইগ্রেশনের জন্য রেপো থেকেও এগুলি অ্যাক্সেস করা যেতে পারে যা আপনি ক্লোন করতে পারেন বা একটি ZIP ফাইল ডাউনলোড করতে পারেন।
কোডল্যাব | পাইথন ২ | পাইথন ৩ |
মডিউল ০ | নিষিদ্ধ | |
মডিউল ১৫ (এই কোডল্যাব) | নিষিদ্ধ |
অনলাইন রিসোর্স
এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক হতে পারে এমন অনলাইন রিসোর্সগুলি নীচে দেওয়া হল:
অ্যাপ ইঞ্জিন
- অ্যাপ ইঞ্জিন ব্লবস্টোর পরিষেবা
- অ্যাপ ইঞ্জিনে সংরক্ষিত ডেটা কোটা এবং সীমা
- অ্যাপ ইঞ্জিন ডকুমেন্টেশন
- পাইথন ২ অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) রানটাইম
- পাইথন ২ অ্যাপ ইঞ্জিনে অ্যাপ ইঞ্জিন বিল্ট-ইন লাইব্রেরি ব্যবহার করা
- অ্যাপ ইঞ্জিনের মূল্য এবং কোটার তথ্য
- দ্বিতীয় প্রজন্মের অ্যাপ ইঞ্জিন প্ল্যাটফর্ম লঞ্চ (২০১৮)
- প্রথম এবং দ্বিতীয় প্রজন্মের প্ল্যাটফর্মের তুলনা করা
- লিগ্যাসি রানটাইমের জন্য দীর্ঘমেয়াদী সহায়তা
- ডকুমেন্টেশন মাইগ্রেশন নমুনা রেপো
- সম্প্রদায়-অবদানিত মাইগ্রেশন নমুনা রেপো
গুগল ক্লাউড
- গুগল ক্লাউড প্ল্যাটফর্মে পাইথন
- গুগল ক্লাউড পাইথন ক্লায়েন্ট লাইব্রেরি
- গুগল ক্লাউড "সর্বদা বিনামূল্যে" স্তর
- গুগল ক্লাউড এসডিকে (জিক্লাউড কমান্ড-লাইন টুল)
- সমস্ত গুগল ক্লাউড ডকুমেন্টেশন
পাইথন
- জ্যাঙ্গো এবং জিনজা২ টেমপ্লেটিং সিস্টেম
-
webapp2ওয়েব ফ্রেমওয়ার্ক -
webapp2ডকুমেন্টেশন -
webapp2_extrasলিঙ্ক -
webapp2_extrasজিনজা২ ডকুমেন্টেশন
ভিডিও
- সার্ভারলেস মাইগ্রেশন স্টেশন
- সার্ভারলেস অভিযান
- গুগল ক্লাউড টেক -এ সাবস্ক্রাইব করুন
- গুগল ডেভেলপারদের সাবস্ক্রাইব করুন
লাইসেন্স
এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।