অ্যাপ ইঞ্জিন ব্লবস্টোর কীভাবে ব্যবহার করবেন (মডিউল 15)

1. ওভারভিউ

কোডল্যাবগুলির সার্ভারলেস মাইগ্রেশন স্টেশন সিরিজ (স্ব-গতিসম্পন্ন, হ্যান্ড-অন টিউটোরিয়াল) এবং সম্পর্কিত ভিডিওগুলির লক্ষ্য হল Google ক্লাউড সার্ভারহীন বিকাশকারীদের তাদের অ্যাপ্লিকেশনগুলিকে এক বা একাধিক মাইগ্রেশনের মাধ্যমে গাইড করে আধুনিকীকরণ করতে সাহায্য করা, প্রাথমিকভাবে উত্তরাধিকার পরিষেবাগুলি থেকে দূরে সরে যাওয়া৷ এটি করা আপনার অ্যাপগুলিকে আরও বহনযোগ্য করে তোলে এবং আপনাকে আরও বিকল্প এবং নমনীয়তা দেয়, যা আপনাকে ক্লাউড পণ্যগুলির একটি বিস্তৃত পরিসরের সাথে একীভূত করতে এবং অ্যাক্সেস করতে এবং আরও সহজে নতুন ভাষা প্রকাশগুলিতে আপগ্রেড করতে সক্ষম করে৷ প্রাথমিকভাবে প্রথম দিকের ক্লাউড ব্যবহারকারীদের উপর ফোকাস করার সময়, প্রাথমিকভাবে অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) ডেভেলপারদের, এই সিরিজটি ক্লাউড ফাংশন এবং ক্লাউড রানের মতো অন্যান্য সার্ভারহীন প্ল্যাটফর্মগুলিকে অন্তর্ভুক্ত করার জন্য যথেষ্ট বিস্তৃত, বা অন্য কোথাও প্রযোজ্য হলে।

এই মডিউল 15 কোডল্যাবটি ব্যাখ্যা করে যে কীভাবে মডিউল 0 থেকে নমুনা অ্যাপে অ্যাপ ইঞ্জিন blobstore ব্যবহার যোগ করতে হয়। তারপরে আপনি সেই ব্যবহারটিকে মডিউল 16-এর পরবর্তী ক্লাউড স্টোরেজে স্থানান্তর করতে প্রস্তুত হবেন।

আপনি কিভাবে শিখবেন

  • অ্যাপ ইঞ্জিন ব্লবস্টোর API/লাইব্রেরির ব্যবহার যোগ করুন
  • blobstore পরিষেবাতে ব্যবহারকারীর আপলোডগুলি সঞ্চয় করুন৷
  • ক্লাউড স্টোরেজে মাইগ্রেট করার জন্য পরবর্তী ধাপের জন্য প্রস্তুত হন

আপনি কি প্রয়োজন হবে

সমীক্ষা

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি Google ক্লাউড পরিষেবাগুলি ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. পটভূমি

অ্যাপ ইঞ্জিন ব্লবস্টোর এপিআই থেকে স্থানান্তরিত করার জন্য, মডিউল 0 থেকে বিদ্যমান বেসলাইন অ্যাপ ইঞ্জিন ndb অ্যাপে এর ব্যবহার যোগ করুন। নমুনা অ্যাপটি ব্যবহারকারীর সাম্প্রতিক দশটি ভিজিট প্রদর্শন করে। শেষ-ব্যবহারকারীকে একটি আর্টিফ্যাক্ট (একটি ফাইল) আপলোড করার জন্য অনুরোধ জানানোর জন্য আমরা অ্যাপটি পরিবর্তন করছি যা তাদের "ভিজিট" এর সাথে মিলে যায়। ব্যবহারকারী যদি তা করতে না চান তবে একটি "এড়িয়ে যান" বিকল্প রয়েছে। ব্যবহারকারীর সিদ্ধান্ত নির্বিশেষে, পরবর্তী পৃষ্ঠাটি মডিউল 0 (এবং এই সিরিজের অন্যান্য অনেক মডিউল) থেকে অ্যাপের মতো একই আউটপুট রেন্ডার করে। এই অ্যাপ ইঞ্জিন blobstore ইন্টিগ্রেশন বাস্তবায়িত হলে, আমরা এটিকে পরবর্তী (মডিউল 16) কোডল্যাবে ক্লাউড স্টোরেজে স্থানান্তর করতে পারি।

অ্যাপ ইঞ্জিন জ্যাঙ্গো এবং জিনজা২ টেমপ্লেটিং সিস্টেমে অ্যাক্সেস প্রদান করে এবং একটি জিনিস যা এই উদাহরণটিকে আলাদা করে তোলে (ব্লবস্টোর অ্যাক্সেস যোগ করা ছাড়াও) তা হল এটি মডিউল 0-তে জ্যাঙ্গো ব্যবহার করা থেকে মডিউল 15-এ জিঞ্জা 2-তে স্যুইচ করে। অ্যাপ ইঞ্জিনের আধুনিকীকরণের একটি গুরুত্বপূর্ণ পদক্ষেপ apps হল webapp2 থেকে ফ্লাস্কে ওয়েব ফ্রেমওয়ার্ক স্থানান্তর করা। পরবর্তীটি তার ডিফল্ট টেমপ্লেটিং সিস্টেম হিসাবে জিনজা 2 ব্যবহার করে, তাই আমরা ব্লবস্টোর অ্যাক্সেসের জন্য webapp2 এ থাকার সময় জিনজা 2 প্রয়োগ করে সেই দিকে অগ্রসর হতে শুরু করি। যেহেতু ফ্লাস্ক ডিফল্টরূপে জিনজা 2 ব্যবহার করে, এর অর্থ হল মডিউল 16-এ টেমপ্লেটের কোনও পরিবর্তন প্রয়োজন হবে না।

3. সেটআপ/প্রিওয়ার্ক

আমরা টিউটোরিয়ালের মূল অংশে যাওয়ার আগে, আপনার প্রজেক্ট সেট আপ করুন, কোডটি পান এবং কাজের কোড দিয়ে শুরু করতে বেসলাইন অ্যাপটি স্থাপন করুন।

1. সেটআপ প্রকল্প

আপনি যদি ইতিমধ্যেই মডিউল 0 অ্যাপ স্থাপন করে থাকেন, আমরা একই প্রকল্প (এবং কোড) পুনরায় ব্যবহার করার পরামর্শ দিই। বিকল্পভাবে, আপনি একটি একেবারে নতুন প্রকল্প তৈরি করতে পারেন বা অন্য একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করতে পারেন। প্রজেক্টের একটি সক্রিয় বিলিং অ্যাকাউন্ট আছে এবং অ্যাপ ইঞ্জিন চালু আছে তা নিশ্চিত করুন।

2. বেসলাইন নমুনা অ্যাপ পান

এই কোডল্যাবের পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 0 নমুনা অ্যাপ থাকা। যদি আপনার কাছে এটি না থাকে, আপনি এটি মডিউল 0 "START" ফোল্ডার থেকে পেতে পারেন (নীচের লিঙ্ক)। এই কোডল্যাবটি আপনাকে প্রতিটি ধাপে নিয়ে যায়, মডিউল 15 "FINISH" ফোল্ডারে যা আছে তার সাথে সাদৃশ্যপূর্ণ কোড দিয়ে শেষ করে।

মডিউল 0 স্টার্টিং ফাইলের ডিরেক্টরিটি এইরকম হওয়া উচিত:

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

3. (পুনরায়) বেসলাইন অ্যাপ স্থাপন করুন

এখন চালানোর জন্য আপনার অবশিষ্ট প্রিওয়ার্ক পদক্ষেপগুলি:

  1. gcloud কমান্ড-লাইন টুলের সাথে নিজেকে পুনরায় পরিচিত করুন
  2. gcloud app deploy সাথে নমুনা অ্যাপটি পুনরায় স্থাপন করুন
  3. অ্যাপটি অ্যাপ ইঞ্জিনে সমস্যা ছাড়াই চলে তা নিশ্চিত করুন

একবার আপনি সফলভাবে এই পদক্ষেপগুলি সম্পাদন করেছেন এবং আপনার ওয়েব অ্যাপটি কাজ করে দেখেছেন (নীচের মতো আউটপুট সহ), আপনি আপনার অ্যাপে ক্যাশিংয়ের ব্যবহার যোগ করতে প্রস্তুত।

a7a9d2b80d706a2b.png

4. কনফিগারেশন ফাইল আপডেট করুন

app.yaml

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

আগে:

runtime: python27
threadsafe: yes
api_version: 1

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

আপনি এখানে দেখেন এমন একটি নতুন libraries বিভাগ যোগ করে আপনার app.yaml ফাইলটি সম্পাদনা করুন:

পরে:

runtime: python27
threadsafe: yes
api_version: 1

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

libraries:
- name: jinja2
  version: latest

অন্য কোন কনফিগারেশন ফাইল আপডেট করার প্রয়োজন নেই, তাই আসুন অ্যাপ্লিকেশন ফাইলগুলিতে এগিয়ে যাই।

5. অ্যাপ্লিকেশন ফাইলগুলি পরিবর্তন করুন

আমদানি এবং Jinja2 সমর্থন

main.py এর পরিবর্তনের প্রথম সেটের মধ্যে রয়েছে Blobstore API-এর ব্যবহার যোগ করা এবং Jinja2-এর সাথে Django টেমপ্লেটিং প্রতিস্থাপন করা। এখানে কি পরিবর্তন হচ্ছে:

  1. os মডিউলটির উদ্দেশ্য হল একটি জ্যাঙ্গো টেমপ্লেটে একটি ফাইল পাথনেম তৈরি করা। যেহেতু আমরা Jinja2-এ স্যুইচ করছি যেখানে এটি পরিচালনা করা হয়, os এর পাশাপাশি Django টেমপ্লেট রেন্ডারার, google.appengine.ext.webapp.template , এর আর প্রয়োজন নেই, তাই সেগুলি সরানো হচ্ছে৷
  2. Blobstore API আমদানি করুন: google.appengine.ext.blobstore
  3. মূল webapp ফ্রেমওয়ার্কে পাওয়া ব্লবস্টোর হ্যান্ডলারগুলি আমদানি করুন—সেগুলি webapp2 : google.appengine.ext.webapp.blobstore_handlers এ উপলব্ধ নয়
  4. 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 ডক্সে সংজ্ঞায়িত জিনজা 2 ব্যবহার সমর্থন করার জন্য কিছু বয়লারপ্লেট কোড যোগ করুন। নিম্নলিখিত কোড স্নিপেটটি জিনজা 2 কার্যকারিতা সহ স্ট্যান্ডার্ড 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))

Blobstore সমর্থন যোগ করুন

এই সিরিজের অন্যান্য মাইগ্রেশনের বিপরীতে যেখানে আমরা নমুনা অ্যাপের কার্যকারিতা বা আউটপুটকে UX-তে (অনেক) পরিবর্তন ছাড়াই অভিন্ন (বা প্রায় একই) রাখি, এই উদাহরণটি আদর্শ থেকে আরও আমূল প্রস্থান করে। অবিলম্বে একটি নতুন ভিজিট রেজিস্টার করার পরিবর্তে সাম্প্রতিক দশটি প্রদর্শন করার পরিবর্তে, আমরা ব্যবহারকারীকে তাদের ভিজিট নিবন্ধন করার জন্য একটি ফাইল আর্টিফ্যাক্টের জন্য অনুরোধ করার জন্য অ্যাপটি আপডেট করছি। শেষ-ব্যবহারকারীরা তখন হয় একটি সংশ্লিষ্ট ফাইল আপলোড করতে পারেন অথবা কিছুতেই আপলোড না করতে "এড়িয়ে যান" নির্বাচন করতে পারেন৷ একবার এই ধাপটি সম্পূর্ণ হলে, "সর্বাধিক সাম্প্রতিক পরিদর্শন" পৃষ্ঠাটি প্রদর্শিত হবে।

এই পরিবর্তনটি আমাদের অ্যাপটিকে অতি সাম্প্রতিক ভিজিট পৃষ্ঠায় সেই ছবি বা অন্যান্য ফাইলের ধরণ সংরক্ষণ করতে (এবং সম্ভবত পরে রেন্ডার) করার জন্য Blobstore পরিষেবা ব্যবহার করার অনুমতি দেয়৷

ডেটা মডেল আপডেট করুন এবং এর ব্যবহার বাস্তবায়ন করুন

আমরা আরও ডেটা সঞ্চয় করছি, বিশেষত ব্লবস্টোরে আপলোড করা ফাইলের আইডি (একটি " 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)

এখানে এখন পর্যন্ত করা পরিবর্তনগুলির একটি সচিত্র উপস্থাপনা রয়েছে:

2270783776759f7f.png

ফাইল আপলোড সমর্থন

কার্যকারিতার সবচেয়ে উল্লেখযোগ্য পরিবর্তন হল ফাইল আপলোড সমর্থন করা, ব্যবহারকারীকে একটি ফাইলের জন্য অনুরোধ করা হোক না কেন, "এড়িয়ে যান" বৈশিষ্ট্যটিকে সমর্থন করা হোক বা ভিজিটের সাথে সম্পর্কিত একটি ফাইল রেন্ডার করা হোক। এর পুরোটাই ছবির অংশ। ফাইল আপলোড সমর্থন করার জন্য এই পরিবর্তনগুলি প্রয়োজন:

  1. প্রধান হ্যান্ডলার GET অনুরোধটি আর প্রদর্শনের জন্য সাম্প্রতিক ভিজিটগুলি নিয়ে আসে না৷ পরিবর্তে, এটি ব্যবহারকারীকে একটি আপলোডের জন্য অনুরোধ করে।
  2. যখন একজন শেষ-ব্যবহারকারী আপলোড করার জন্য একটি ফাইল জমা দেয় বা সেই প্রক্রিয়াটি এড়িয়ে যায়, তখন ফর্ম থেকে একটি POST নতুন UploadHandler কে নিয়ন্ত্রণ করে, যা google.appengine.ext.webapp.blobstore_handlers.BlobstoreUploadHandler থেকে প্রাপ্ত।
  3. UploadHandler POST পদ্ধতি আপলোডটি সম্পাদন করে, ভিজিট নিবন্ধন করতে store_visit() কল করে এবং ব্যবহারকারীকে "/" এ ফেরত পাঠাতে একটি HTTP 307 পুনঃনির্দেশ ট্রিগার করে, যেখানে...
  4. ( fetch_visits() এর মাধ্যমে) প্রধান হ্যান্ডলারের POST পদ্ধতির ক্যোয়ারী এবং সাম্প্রতিক ভিজিটগুলি প্রদর্শন করে। ব্যবহারকারী যদি "এড়িয়ে যান" নির্বাচন করেন, তাহলে কোনো ফাইল আপলোড করা হয় না, তবে একই পুনঃনির্দেশ অনুসরণ করে ভিজিটটি এখনও নিবন্ধিত থাকে।
  5. অতি সাম্প্রতিক ভিজিট ডিসপ্লেতে ব্যবহারকারীর কাছে প্রদর্শিত একটি নতুন ক্ষেত্র রয়েছে, হয় একটি হাইপারলিঙ্ক করা "ভিউ" যদি একটি আপলোড ফাইল উপলব্ধ থাকে বা অন্যথায় "কোনটিই নয়"। এই পরিবর্তনগুলি এইচটিএমএল টেমপ্লেটে একটি আপলোড ফর্ম যোগ করার সাথে উপলব্ধি করা হয়েছে (শীঘ্রই এই বিষয়ে আরও কিছু আসছে)।
  6. যদি কোনো শেষ-ব্যবহারকারী আপলোড করা ভিডিওর সাথে যেকোনো ভিজিটের জন্য "দেখুন" লিঙ্কে ক্লিক করে, তাহলে এটি একটি নতুন ViewBlobHandler এর কাছে একটি GET অনুরোধ করে, যা google.appengine.ext.webapp.blobstore_handlers.BlobstoreDownloadHandler থেকে প্রাপ্ত, হয় ফাইলটি রেন্ডার করে যদি কোনো ছবি (যদি ব্রাউজারে সমর্থিত হয়), না থাকলে ডাউনলোড করার জন্য অনুরোধ করা, অথবা খুঁজে না পাওয়া গেলে একটি HTTP 404 ত্রুটি ফিরিয়ে দেওয়া।
  7. নতুন জোড়া হ্যান্ডলার ক্লাসের পাশাপাশি তাদের কাছে ট্রাফিক পাঠানোর জন্য একটি নতুন জোড়া রুট ছাড়াও, উপরে বর্ণিত 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)

এই আপডেটগুলি বাস্তবায়িত হওয়ার সাথে সাথে, এখন তিনটি হ্যান্ডলার রয়েছে: 1) একটি POST পদ্ধতি সহ আপলোড হ্যান্ডলার, 2) একটি GET পদ্ধতি সহ একটি "ভিউ ব্লব" ডাউনলোড হ্যান্ডলার এবং 3) 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 এ একটি কল আছে। এটিই আসল যাদু যা ফাইলটিকে ব্লবস্টোরে রাখে এবং সেই ফাইলটির জন্য একটি অনন্য এবং স্থায়ী আইডি ফেরত দেয়, এটির BlobKey
  • ViewBlobHandler.get এ, blobstore_handlers.BlobstoreDownloadHandler.send একটি ফাইলের BlobKey এর সাথে কল করার ফলে ফাইলটি আনা হয় এবং শেষ-ব্যবহারকারীর ব্রাউজারে ফরওয়ার্ড করা হয়

এই কলগুলি অ্যাপে যোগ করা বৈশিষ্ট্যগুলি অ্যাক্সেস করার সিংহভাগ প্রতিনিধিত্ব করে। এখানে main.py তে পরিবর্তনের এই দ্বিতীয় এবং চূড়ান্ত সেটটির একটি সচিত্র উপস্থাপনা রয়েছে:

da2960525ac1b90d.png

HTML টেমপ্লেট আপডেট করুন

মূল অ্যাপ্লিকেশনের কিছু আপডেট অ্যাপের ইউজার ইন্টারফেস (UI) কে প্রভাবিত করে, তাই ওয়েব টেমপ্লেটে সংশ্লিষ্ট পরিবর্তন প্রয়োজন, আসলে দুটি:

  1. 3টি ইনপুট উপাদান সহ একটি ফাইল আপলোড ফর্ম প্রয়োজন: ফাইল আপলোড এবং এড়িয়ে যাওয়ার জন্য যথাক্রমে একটি ফাইল এবং এক জোড়া জমা বোতাম৷
  2. একটি সংশ্লিষ্ট ফাইল আপলোড বা অন্যথায় "কোনটি নয়" ভিজিটের জন্য একটি "ভিউ" লিঙ্ক যোগ করে সাম্প্রতিক ভিজিট আউটপুট আপডেট করুন৷

আগে:

<!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 এ প্রয়োজনীয় আপডেটগুলিকে চিত্রিত করে:

8583e975f25aa9e7.png

একটি চূড়ান্ত পরিবর্তন হল যে জিনজা2 তার টেমপ্লেটগুলিকে একটি templates ফোল্ডারে পছন্দ করে, তাই সেই ফোল্ডারটি তৈরি করুন এবং এর ভিতরে index.html সরান৷ এই চূড়ান্ত পদক্ষেপের সাথে, আপনি এখন মডিউল 0 নমুনা অ্যাপে ব্লবস্টোর ব্যবহার যোগ করার জন্য প্রয়োজনীয় সমস্ত পরিবর্তনগুলি সম্পন্ন করেছেন৷

(ঐচ্ছিক) ক্লাউড স্টোরেজ "বর্ধিতকরণ"

ব্লবস্টোর স্টোরেজ শেষ পর্যন্ত ক্লাউড স্টোরেজেই বিকশিত হয়েছে। এর মানে হল যে ব্লবস্টোর আপলোডগুলি ক্লাউড কনসোলে, বিশেষত ক্লাউড স্টোরেজ ব্রাউজারে দৃশ্যমান। প্রশ্ন হল কোথায়। উত্তর হল আপনার অ্যাপ ইঞ্জিন অ্যাপের ডিফল্ট ক্লাউড স্টোরেজ বাকেট। এটির নামটি আপনার অ্যাপ ইঞ্জিন অ্যাপের সম্পূর্ণ ডোমেন নামের নাম, PROJECT_ID .appspot.com । এটি এত সুবিধাজনক কারণ সমস্ত প্রকল্প আইডি অনন্য, তাই না?

নমুনা অ্যাপ্লিকেশনে করা আপডেটগুলি আপলোড করা ফাইলগুলিকে সেই বালতিতে ফেলে দেয়, তবে বিকাশকারীদের আরও নির্দিষ্ট অবস্থান বেছে নেওয়ার বিকল্প রয়েছে। ডিফল্ট বাকেটটি google.appengine.api.app_identity.get_default_gcs_bucket_name() এর মাধ্যমে প্রোগ্রাম্যাটিকভাবে অ্যাক্সেসযোগ্য, আপনি যদি এই মানটি অ্যাক্সেস করতে চান তবে একটি নতুন আমদানি প্রয়োজন, আপলোড করা ফাইলগুলিকে সংগঠিত করার জন্য একটি উপসর্গ হিসাবে ব্যবহার করতে বলুন৷ উদাহরণস্বরূপ, ফাইলের প্রকার অনুসারে সাজানো:

f61f7a23a1518705.png

ইমেজগুলির জন্য এরকম কিছু বাস্তবায়ন করতে, উদাহরণস্বরূপ, আপনার কাছে কিছু কোডের সাথে এইরকম কোড থাকবে যা পছন্দসই বালতির নাম বাছাই করার জন্য ফাইলের প্রকারগুলি চেক করেছে:

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

আপনি চিত্রের ধরন নিশ্চিত করতে পাইথন স্ট্যান্ডার্ড লাইব্রেরি imghdr মডিউলের মতো একটি টুল ব্যবহার করে আপলোড করা ছবিগুলিকেও যাচাই করবেন। অবশেষে, আপনি সম্ভবত খারাপ অভিনেতাদের ক্ষেত্রে আপলোডের আকার সীমিত করতে চাইবেন।

বলা যাক সব করা হয়েছে. আপলোড করা ফাইলগুলি কোথায় সংরক্ষণ করতে হবে তা উল্লেখ করার জন্য আমরা কীভাবে আমাদের অ্যাপ আপডেট করতে পারি? মূলটি হল MainHandler.getblobstore.create_upload_url এ কলটি টুইক করা gs_bucket_name

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

যেহেতু এটি একটি ঐচ্ছিক আপডেট যদি আপনি উল্লেখ করতে চান যে আপলোডগুলি কোথায় যেতে হবে, এটি রেপোতে main.py ফাইলের অংশ নয়৷ পরিবর্তে, রেপোতে আপনার পর্যালোচনার জন্য main-gcs.py নামের একটি বিকল্প উপলব্ধ। একটি পৃথক বালতি "ফোল্ডার" ব্যবহার করার পরিবর্তে, main-gcs.py স্টোরে থাকা কোডটি main.py এর মতোই "রুট" বাকেট ( PROJECT_ID .appspot.com ) এ আপলোড করে কিন্তু আপনি যদি ড্রাইভ করতে চান তাহলে আপনার প্রয়োজনীয় স্ক্যাফোল্ডিং প্রদান করে এই বিভাগে ইঙ্গিত হিসাবে আরো কিছু মধ্যে নমুনা. নীচে main.py এবং main-gcs.py এর মধ্যে "পার্থক্য" এর একটি চিত্র দেওয়া হল।

256e1ea68241a501.png

6. সারাংশ/পরিষ্কার

এই বিভাগটি এই কোডল্যাবটিকে অ্যাপ স্থাপন করে, যাচাই করে এটিকে উদ্দেশ্য করে এবং যে কোনো প্রতিফলিত আউটপুটে কাজ করে। অ্যাপ্লিকেশান যাচাইকরণের পরে, যেকোন পরিচ্ছন্নতার পদক্ষেপগুলি সম্পাদন করুন এবং পরবর্তী পদক্ষেপগুলি বিবেচনা করুন৷

প্রয়োগ এবং আবেদন যাচাই

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

f5b5f9f19d8ae978.png সেখান থেকে, শেষ-ব্যবহারকারীরা হয় একটি ফাইল আপলোড করে "জমা দিন" ক্লিক করুন বা কিছু আপলোড না করতে "এড়িয়ে যান" এ ক্লিক করুন। উভয় ক্ষেত্রেই, ফলাফল হল অতি সাম্প্রতিক ভিজিট স্ক্রীন, এখন ভিজিট টাইমস্ট্যাম্প এবং ভিজিটর তথ্যের মধ্যে "দেখুন" লিঙ্ক বা "কোনটিই নয়" সহ বর্ধিত:

f5ac6b98ee8a34cb.png

মডিউল 0 নমুনা অ্যাপে অ্যাপ ইঞ্জিন ব্লবস্টোরের ব্যবহার যোগ করে এই কোডল্যাবটি সম্পূর্ণ করার জন্য অভিনন্দন। আপনার কোড এখন ফিনিশ (মডিউল 15) ফোল্ডারে যা আছে তার সাথে মেলে। বিকল্প main-gcs.py ও সেই ফোল্ডারে রয়েছে।

পরিষ্কার করুন

সাধারণ

আপনি যদি আপাতত কাজ শেষ করে থাকেন, তাহলে বিলিং এড়াতে আমরা আপনাকে আপনার অ্যাপ ইঞ্জিন অ্যাপটি নিষ্ক্রিয় করার পরামর্শ দিই। তবে আপনি যদি আরও কিছু পরীক্ষা বা পরীক্ষা করতে চান, অ্যাপ ইঞ্জিন প্ল্যাটফর্মের একটি বিনামূল্যের কোটা রয়েছে, এবং যতক্ষণ না আপনি সেই ব্যবহারের স্তরটি অতিক্রম না করেন, আপনাকে চার্জ করা উচিত নয়। এটি গণনার জন্য, তবে প্রাসঙ্গিক অ্যাপ ইঞ্জিন পরিষেবাগুলির জন্যও চার্জ হতে পারে, তাই আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন৷ যদি এই স্থানান্তরের সাথে অন্যান্য ক্লাউড পরিষেবা জড়িত থাকে, তবে সেগুলি আলাদাভাবে বিল করা হবে৷ উভয় ক্ষেত্রে, প্রযোজ্য হলে, নীচের "এই কোডল্যাবের জন্য নির্দিষ্ট" বিভাগটি দেখুন।

সম্পূর্ণ প্রকাশের জন্য, অ্যাপ ইঞ্জিনের মতো একটি Google ক্লাউড সার্ভারবিহীন গণনা প্ল্যাটফর্মে স্থাপন করা সামান্য বিল্ড এবং স্টোরেজ খরচ বহন করে। ক্লাউড স্টোরেজের মতো ক্লাউড বিল্ডের নিজস্ব ফ্রি কোটা রয়েছে। সেই ছবির সঞ্চয়স্থান সেই কোটার কিছু ব্যবহার করে। যাইহোক, আপনি এমন একটি অঞ্চলে বাস করতে পারেন যেখানে এই ধরনের বিনামূল্যের স্তর নেই, তাই সম্ভাব্য খরচ কমাতে আপনার স্টোরেজ ব্যবহার সম্পর্কে সচেতন থাকুন। নির্দিষ্ট ক্লাউড স্টোরেজ "ফোল্ডার" আপনার পর্যালোচনা করা উচিত:

  • 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 *করণের উপর নির্ভর করে, উদাহরণস্বরূপ, " us " যদি আপনার অ্যাপটি USA তে হোস্ট করা হয়৷

অন্যদিকে, আপনি যদি এই অ্যাপ্লিকেশন বা অন্যান্য সম্পর্কিত মাইগ্রেশন কোডল্যাবগুলি চালিয়ে যেতে না চান এবং সবকিছু সম্পূর্ণরূপে মুছে ফেলতে চান, তাহলে আপনার প্রকল্পটি বন্ধ করুন

এই কোডল্যাবের জন্য নির্দিষ্ট

নীচে তালিকাভুক্ত পরিষেবাগুলি এই কোডল্যাবের জন্য অনন্য৷ আরও তথ্যের জন্য প্রতিটি পণ্যের ডকুমেন্টেশন পড়ুন:

পরবর্তী পদক্ষেপ

বিবেচনা করার জন্য পরবর্তী যৌক্তিক স্থানান্তরটি মডিউল 16-এ কভার করা হয়েছে, ডেভেলপারদের দেখায় যে কীভাবে অ্যাপ ইঞ্জিন ব্লবস্টোর পরিষেবা থেকে ক্লাউড স্টোরেজ ক্লায়েন্ট লাইব্রেরি ব্যবহার করে মাইগ্রেট করা যায়। আপগ্রেড করার সুবিধাগুলির মধ্যে রয়েছে আরও ক্লাউড স্টোরেজ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে সক্ষম হওয়া, অ্যাপ ইঞ্জিনের বাইরের অ্যাপগুলির জন্য কাজ করে এমন একটি ক্লায়েন্ট লাইব্রেরির সাথে পরিচিত হওয়া, তা Google ক্লাউড, অন্যান্য ক্লাউড বা এমনকি অন-প্রিমাইজে। আপনি যদি ক্লাউড স্টোরেজ থেকে উপলব্ধ সমস্ত বৈশিষ্ট্যের প্রয়োজন বলে মনে না করেন বা খরচের উপর এর প্রভাব সম্পর্কে উদ্বিগ্ন হন, তাহলে আপনি অ্যাপ ইঞ্জিন ব্লবস্টোরে থাকতে পারবেন।

মডিউল 16 এর বাইরে ক্লাউড এনডিবি এবং ক্লাউড ডেটাস্টোর, ক্লাউড টাস্কস বা ক্লাউড মেমোরিস্টোরের মতো অন্যান্য সম্ভাব্য স্থানান্তরগুলির একটি সম্পূর্ণ সংখ্যা। এছাড়াও ক্লাউড রান এবং ক্লাউড ফাংশনে ক্রস-প্রোডাক্ট মাইগ্রেশন রয়েছে। মাইগ্রেশন রেপোতে সমস্ত কোডের নমুনা রয়েছে, আপনাকে উপলব্ধ সমস্ত কোডল্যাব এবং ভিডিওগুলির সাথে লিঙ্ক করে এবং কোন মাইগ্রেশনগুলি বিবেচনা করতে হবে এবং মাইগ্রেশনের যে কোনও প্রাসঙ্গিক "অর্ডার" এর নির্দেশিকাও প্রদান করে৷

7. অতিরিক্ত সম্পদ

কোডল্যাব সমস্যা/প্রতিক্রিয়া

আপনি যদি এই কোডল্যাবের সাথে কোনো সমস্যা খুঁজে পান, অনুগ্রহ করে ফাইল করার আগে প্রথমে আপনার সমস্যাটি অনুসন্ধান করুন। অনুসন্ধান এবং নতুন সমস্যা তৈরি করার লিঙ্ক:

মাইগ্রেশন সম্পদ

মডিউল 0 (স্টার্ট) এবং মডিউল 15 (ফিনিশ) এর জন্য রেপো ফোল্ডারগুলির লিঙ্কগুলি নীচের টেবিলে পাওয়া যাবে। এগুলি সমস্ত অ্যাপ ইঞ্জিন কোডল্যাব মাইগ্রেশনের জন্য রেপো থেকে অ্যাক্সেস করা যেতে পারে যা আপনি একটি জিপ ফাইল ক্লোন বা ডাউনলোড করতে পারেন।

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 0

কোড

N/A

মডিউল 15 (এই কোডল্যাব)

কোড

N/A

অনলাইন সম্পদ

নীচে অনলাইন সংস্থান রয়েছে যা এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক হতে পারে:

অ্যাপ ইঞ্জিন

গুগল ক্লাউড

পাইথন

ভিডিও

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।