মডিউল 1: App Engine webapp2 থেকে ফ্লাস্কে স্থানান্তর করুন

১. সংক্ষিপ্ত বিবরণ

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

এই প্রাথমিক টিউটোরিয়ালটি অ্যাপ ইঞ্জিন অ্যাপে ওয়েব ফ্রেমওয়ার্ক আধুনিকীকরণের প্রথম ধাপগুলো দেখায়: webapp2 থেকে Flask- এ স্থানান্তর। আপনার অ্যাপে আপনি রাউটিং পরিচালনা করে এমন যেকোনো ওয়েব ফ্রেমওয়ার্ক ব্যবহার করতে পারেন, কিন্তু এই টিউটোরিয়ালের জন্য আমরা Flask ব্যবহার করছি, কারণ এটি কমিউনিটিতে ব্যাপকভাবে ব্যবহৃত হয়।

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

  • তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করুন (অন্তর্নির্মিত বা অন্য কোনোভাবে)
  • কনফিগারেশন ফাইল আপডেট করুন
  • একটি সাধারণ অ্যাপ webapp2 থেকে Flask-এ স্থানান্তর করুন

আপনার যা যা লাগবে

জরিপ

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

শুধু একবার পড়ে দেখুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

২. পটভূমি

২০০৮ সালে পাইথন ২.৫-এ অ্যাপ ইঞ্জিন প্রথম চালু হওয়ার সময় webapp ফ্রেমওয়ার্কটি এর সাথে অন্তর্ভুক্ত ছিল। বহু বছর পর, ২০১৩ সালে ২.৭ রানটাইমটি ২.৫-কে অপ্রচলিত ঘোষণা করলে, এর উত্তরসূরি webapp2 দ্বারা এটি প্রতিস্থাপিত হয়।

যদিও webapp2 ( ডকুমেন্টেশন দেখুন) এখনও বিদ্যমান এবং App Engine-এর বাইরে একটি WSGI-সম্মত ওয়েব ফ্রেমওয়ার্ক হিসেবে ব্যবহার করা যায়, এটি অ্যাপ্লিকেশনের উপযুক্ত কোডে ব্যবহারকারীর অনুরোধগুলো নিজে থেকে রাউটিং করে না। পরিবর্তে, ওয়েব ট্র্যাফিককে সংশ্লিষ্ট "হ্যান্ডলার"-গুলোতে রাউটিং করার জন্য এটি App Engine, কনফিগারেশন ফাইল এবং ডেভেলপারের উপর নির্ভর করে। অধিকন্তু, webapp2 এর মূল সুবিধাগুলো App Engine-এর বান্ডেল করা পরিষেবাগুলোর সাথে অবিচ্ছেদ্যভাবে জড়িত, যা এটিকে কার্যত অপ্রচলিত করে তুলেছে, যদিও এটি Python 3-এ কাজ করে ( সম্পর্কিত ইস্যুটিও দেখুন)।

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

এই স্থানান্তরের প্রাথমিক পদক্ষেপগুলো হলো:

  1. প্রস্তুতি/পূর্বপ্রস্তুতি
  2. ফ্লাস্ক থার্ড-পার্টি লাইব্রেরি যোগ করুন
  3. অ্যাপ্লিকেশন ফাইলগুলি আপডেট করুন
  4. এইচটিএমএল টেমপ্লেট ফাইল আপডেট করুন

৩. প্রস্তুতি/পূর্বপ্রস্তুতি

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

১. প্রকল্প স্থাপন করুন

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

২. বেসলাইন নমুনা অ্যাপ ডাউনলোড করুন

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

POSIX ls কমান্ডের সাহায্যে যেমন দেখানো হয়েছে, মডিউল 0 ফোল্ডারে ফাইলগুলো দেখতে এইরকম হওয়া উচিত:

$ ls
app.yaml        index.html      main.py

৩. gcloud কমান্ডগুলোর সাথে পুনরায় পরিচিত হন

আপনার মেশিনে যদি এখনও gcloud কমান্ডটি না থাকে, তাহলে Google Cloud SDK ইনস্টল করুন এবং নিশ্চিত করুন যে gcloud আপনার এক্সিকিউশন পাথের অংশ হিসেবে উপলব্ধ আছে। এছাড়া নিম্নলিখিত gcloud কমান্ডগুলোর সাথে পরিচিত হয়ে নিন:

  1. gcloud components update — Google Cloud SDK আপডেট করুন
  2. gcloud auth login — আপনার ক্রেডেনশিয়ালযুক্ত অ্যাকাউন্টে লগইন করুন
  3. gcloud config list — GCP প্রোজেক্ট কনফিগারেশন সেটিংসের তালিকা
  4. gcloud config set project PROJECT_ID — GCP প্রজেক্ট আইডি সেট করুন
  5. gcloud app deploy — আপনার অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনটি ডিপ্লয় করুন

আপনি যদি সম্প্রতি gcloud দিয়ে অ্যাপ ইঞ্জিন ডেভেলপমেন্ট না করে থাকেন, তাহলে পরবর্তী ধাপে যাওয়ার আগে প্রস্তুত হওয়ার জন্য আপনার প্রথম চারটি কমান্ড (#১-#৪) চালানো উচিত। চলুন এই কমান্ডগুলো সম্পর্কে সংক্ষেপে জেনে নেওয়া যাক।

প্রথমত, gcloud components update নিশ্চিত করে যে আপনার কাছে ক্লাউড এসডিকে-র সর্বশেষ সংস্করণটি রয়েছে। এই কমান্ডটি চালালে নিম্নলিখিত আউটপুটের মতো একটি ফলাফল পাওয়া যাবে:

$ gcloud components update

Your current Cloud SDK version is: 317.0.0
You will be upgraded to version: 318.0.0

┌──────────────────────────────────────────────────┐
│        These components will be updated.         │
├──────────────────────────┬────────────┬──────────┤
│           Name           │  Version   │   Size   │
├──────────────────────────┼────────────┼──────────┤
│ Cloud SDK Core Libraries │ 2020.11.06 │ 15.5 MiB │
│ gcloud cli dependencies  │ 2020.11.06 │ 10.6 MiB │
└──────────────────────────┴────────────┴──────────┘

The following release notes are new in this upgrade.
Please read carefully for information about new features, breaking changes,
and bugs fixed.  The latest full release notes can be viewed at:
  https://cloud.google.com/sdk/release_notes

318.0.0 (2020-11-10)

      . . .
      (release notes)
      . . .

    Subscribe to these release notes at
    https://groups.google.com/forum/#!forum/google-cloud-sdk-announce.

Do you want to continue (Y/n)?

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area                             ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: Cloud SDK Core Libraries                   ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: gcloud cli dependencies                    ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SDK Core Libraries                     ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: gcloud cli dependencies                      ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...done.

Update done!

To revert your SDK to the previously installed version, you may run:
  $ gcloud components update --version 317.0.0

এরপরে, পরবর্তীতে ব্যবহার করার জন্য gcloud কমান্ডগুলোর জন্য নিজেকে প্রমাণীকৃত করতে gcloud auth login ব্যবহার করুন:

$ gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?response_type=code&client_id= . . .

You are now logged in as [YOUR_EMAIL].
Your current project is [PROJECT_ID].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

আপনার বর্তমান প্রোজেক্ট সেটিংস দেখতে gcloud config list ব্যবহার করুন:

$ gcloud config list
[core]
account = YOUR_EMAIL
disable_usage_reporting = False
project = PROJECT_ID

Your active configuration is: [default]

উপরের কমান্ডটি আপনাকে একটি নতুন প্রজেক্ট তৈরি করতে বা বিদ্যমান কোনো প্রজেক্ট নির্বাচন করতে সাহায্য করবে। যদি gcloud config list এর আউটপুট এই টিউটোরিয়ালের জন্য আপনার নির্বাচিত প্রজেক্টের সাথে না মেলে, তাহলে প্রজেক্ট আইডি সেট করার জন্য gcloud config set project PROJECT_ID চালান। এরপর, সঠিক প্রজেক্ট আইডি সেট হয়েছে কিনা তা নিশ্চিত করতে আবার gcloud config list চালান।

$ gcloud config set project PROJECT_ID
Updated property [core/project].

এর পরিবর্তে আপনি যদি ক্লাউড কনসোল ব্যবহার করতে পছন্দ করেন, তবে আপনি চাইলে ইউজার ইন্টারফেস অনুসরণ করে একটি নতুন প্রজেক্ট তৈরি করতে পারেন অথবা আপনার আগে থেকে থাকা যেকোনো প্রজেক্ট ব্যবহার করতে পারেন। আপনার প্রজেক্টের ড্যাশবোর্ডে, আপনি প্রজেক্ট ইনফো কার্ডটি দেখতে পাবেন, যেখানে এর আইডি (প্রজেক্টের নাম এবং নম্বরের সাথে) দেখানো থাকে:

প্রকল্পের তথ্য কার্ড

শেষ কমান্ড (#5), gcloud app deploy , আপনার অ্যাপটিকে অ্যাপ ইঞ্জিনে ডেপ্লয় করার জন্য। যেহেতু আমরা সবে শুরু করছি, তাই এখনই এটি চালানো ঐচ্ছিক, কিন্তু মডিউল ০ কোডটি কাজ করছে কিনা তা নিশ্চিত করার জন্য ডেপ্লয় করতে আমরা অবশ্যই নিরুৎসাহিত করি না। এটি চালানোর সময়, আপনি যে ভৌগোলিক অঞ্চলে অ্যাপটি চালাতে চান তা নির্বাচন করুন (সাধারণত যেখানে আপনি অবস্থান করছেন)। তবে একবার সেট করে নিলে এটি আর পরিবর্তন করা যাবে না। এরপর ডেপ্লয়মেন্টের বাকি তথ্যগুলো লক্ষ্য করুন। এটি সম্পন্ন হলে, আপনার অ্যাপটি কোন URL-এ সার্ভ করা হবে সে সম্পর্কে আপনাকে জানানো হবে। আপনি যা দেখতে পারেন তার একটি সংক্ষিপ্ত সংস্করণ নিচে দেওয়া হলো:

$ gcloud app deploy
Services to deploy:

descriptor:      [/private/tmp/mod0-baseline/app.yaml]
source:          [/private/tmp/mod0-baseline]
target project:  [PROJECT_ID]
target service:  [default]
target version:  [20201116t220827]
target url:      [https://PROJECT_ID.REG_ABBR.r.appspot.com]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1 file to Google Cloud Storage                 ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.REG_ABBR.r.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

আপনি যদি বেশ কিছুদিন ধরে অ্যাপ ইঞ্জিন ব্যবহার না করে থাকেন, তাহলে হয়তো লক্ষ্য করেছেন যে মূল ডেপ্লয়মেন্ট appcfg.py update কমান্ডটি gcloud app deploy দ্বারা প্রতিস্থাপিত হয়েছে। gcloud app deploy সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন পৃষ্ঠাটি দেখুন।

আরেকটি সাম্প্রতিক পরিবর্তন হলো ডেপ্লয় করা অ্যাপগুলোর URL, যা http://PROJECT_ID.appspot.com থেকে পরিবর্তন করে http://PROJECT_ID.REG_ABBR.r.appspot.com করা হয়েছে। বেশিরভাগ অ্যাপই অবশেষে নতুন ফরম্যাটে রূপান্তরিত হবে। URL ফরম্যাট সম্পর্কে আরও তথ্য রিকোয়েস্ট এবং রাউটিং ডকুমেন্টেশনে পাওয়া যাবে।

অ্যাপটি ডেপ্লয় করার পর, সর্বশেষ ভিজিটগুলো দেখতে ব্রাউজারটি রিফ্রেশ করুন (প্রয়োজনে কয়েকবার):

ভিজিটমি অ্যাপ

আপনার অ্যাপটি নতুন হলে, আপনি মাত্র একটি বা কয়েকটি ভিজিট দেখতে পাবেন।

৪. ফ্লাস্ক থার্ড-পার্টি লাইব্রেরি যোগ করুন

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

যেসব থার্ড-পার্টি লাইব্রেরি বিল্ট-ইন নয় , সেগুলোকে requirements.txt নামের একটি ফাইলে উল্লেখ করতে হবে এবং অ্যাপ্লিকেশন কোডের ডিরেক্টরির lib ফোল্ডারে স্থানীয়ভাবে ইনস্টল করতে হবে, যেখানে সবকিছু App Engine-এ আপলোড করা হয়। থার্ড-পার্টি লাইব্রেরি বান্ডলিং সংক্রান্ত ডকুমেন্টেশনে আরও তথ্য রয়েছে।

Flask-এর মতো কপি করা লাইব্রেরিগুলোর জন্য আপনাকে appengine_config.py কনফিগারেশন ফাইলটি ব্যবহার করে App Engine-কে lib ফোল্ডারে সেগুলোকে খুঁজতে বলতে হবে। appengine_config.py কনফিগারেশন ফাইলটি requirements.txt এবং lib এর সাথে একই টপ-লেভেল অ্যাপ্লিকেশন ফোল্ডারে রাখা হয়। টিউটোরিয়ালের এই অংশে, আপনি যা শিখবেন:

  • requirements.txt তৈরি করুন (কপি করা [নন-বিল্ট-ইন] থার্ড-পার্টি লাইব্রেরিগুলো উল্লেখ করুন)
  • appengine_config.py তৈরি করুন (তৃতীয় পক্ষের লাইব্রেরিগুলো শনাক্ত করুন)
  • (তৃতীয় পক্ষের) প্যাকেজ এবং নির্ভরতা ইনস্টল করুন

১. requirements.txt তৈরি করুন।

আপনার প্যাকেজগুলো নির্দিষ্ট করার জন্য একটি requirements.txt ফাইল তৈরি করুন। আমাদের ক্ষেত্রে, Flask হলো প্রয়োজনীয় থার্ড-পার্টি লাইব্রেরি। এই লেখাটি লেখার সময়, এর সর্বশেষ সংস্করণটি হলো 1.1.2, তাই requirements.txt ফাইলটিতে এই একটি লাইন যোগ করুন:

Flask==1.1.2

গৃহীত ফরম্যাটগুলো সম্পর্কে আরও জানতে requirements.txt ডকুমেন্টেশনটি দেখুন।

২. appengine_config.py তৈরি করুন।

পরবর্তী ধাপ হলো অ্যাপ ইঞ্জিনকে বাহ্যিক থার্ড-পার্টি লাইব্রেরিগুলো চিনিয়ে দেওয়া। appengine_config.py নামে একটি ফাইল তৈরি করুন এবং তাতে নিম্নলিখিত বিষয়বস্তু যোগ করুন:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

এই কোডটি ঠিক তাই করে যা আমরা আগে নির্দিষ্ট করেছিলাম, অর্থাৎ, কপি করা লাইব্রেরিগুলোর জন্য অ্যাপ ইঞ্জিনকে lib ফোল্ডারে নির্দেশ করে।

৩. প্যাকেজ এবং নির্ভরতা ইনস্টল করুন

এখন pip install কমান্ডটি চালিয়ে ` lib ফোল্ডারটি তৈরি করুন এবং সেখানে Flask ও এর নির্ভরতাগুলো ইনস্টল করুন:

$ pip install -t lib -r requirements.txt

আপনি pip বা pip2 যা-ই ব্যবহার করুন না কেন, প্যাকেজ ইনস্টলেশন সম্পন্ন হওয়ার পর আপনার একটি lib ফোল্ডার থাকবে, যার বিষয়বস্তু নিম্নরূপ হবে:

$ ls lib
bin/
click/
click-7.1.2.dist-info/
flask/
Flask-1.1.2.dist-info/
itsdangerous/
itsdangerous-1.1.0.dist-info/
jinja2/
Jinja2-2.11.2.dist-info/
markupsafe/
MarkupSafe-1.1.1.dist-info/
werkzeug/
Werkzeug-1.0.1.dist-info/

৫. অ্যাপ্লিকেশন ফাইলগুলো আপডেট করুন

এবার অ্যাপ্লিকেশন ফাইল main.py আপডেট করা যাক।

১. আমদানি

সব পাইথন ফাইলের মতোই ইম্পোর্টগুলো প্রথমে আসে। webapp2 ফ্রেমওয়ার্ক ইম্পোর্টের পরে ndb ডেটাস্টোর লাইব্রেরি এবং সবশেষে, অ্যাপ ইঞ্জিন এক্সটেনশনটি আসে, যা জ্যাঙ্গো-ধাঁচের টেমপ্লেটগুলো প্রসেস করে। আপনি নিম্নলিখিতটি দেখতে পাবেন:

  • পূর্বে:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template

Flask-এ স্থানান্তরিত হওয়ার সময়, আপনাকে একই সাথে Flask এবং টেমপ্লেট রেন্ডারার উভয় অংশই ইম্পোর্ট করতে হবে। webapp2 সম্পর্কিত ইম্পোর্টের জোড়াটি মুছে ফেলুন এবং সেগুলোকে নিম্নরূপে প্রতিস্থাপন করুন ( ndb ইম্পোর্টটি অপরিবর্তিত রাখুন):

  • পরে:
from flask import Flask, render_template, request
from google.appengine.ext import ndb

২. স্টার্টআপ

webapp2 ব্যবহারকারী অ্যাপগুলির জন্য একটিমাত্র অ্যারে (পাইথন লিস্ট) প্রয়োজন, যা যেকোনো পাইথন ফাইলের সমস্ত রাউট এবং হ্যান্ডলারকে তালিকাভুক্ত করে (এছাড়াও অন্যান্য ফাইলও থাকতে পারে):

  • পূর্বে:
app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

মনে রাখবেন যে app.yaml উচ্চ-স্তরের রাউটিং সম্পাদন করে এবং বিভিন্ন হ্যান্ডলারকে কল করতে পারে। নমুনা অ্যাপটি এতটাই সহজ যে সমস্ত রাউট main.py হ্যান্ডলারে এসে পৌঁছায়।

Flask এইভাবে রাউটিং টেবিল ব্যবহার করে না, তাই main.py থেকে এই লাইনগুলো মুছে দিন । Flask-এর ইনিশিয়ালাইজেশনও প্রয়োজন, তাই main.py একদম উপরে imports-এর ঠিক নিচে নিম্নলিখিত লাইনটি যোগ করুন:

  • পরে:
app = Flask(__name__)

ফ্লাস্কে, প্রথমে ফ্রেমওয়ার্কটি ইনিশিয়ালাইজ করা হয় এবং তারপর ডেকোরেটর ব্যবহার করে রাউটগুলো সংজ্ঞায়িত করা হয়। এছাড়াও, রাউটগুলো ফাংশনের সাথে যুক্ত থাকে, ক্লাস বা মেথডের সাথে নয়।

এই কোডল্যাবে ফ্লাস্ক টিউটোরিয়াল অন্তর্ভুক্ত করা সম্ভব নয়, তাই ফ্রেমওয়ার্কটির সাথে আরও স্বচ্ছন্দ হতে কিছু সময় নিয়ে ফ্লাস্ক টিউটোরিয়ালটি সম্পন্ন করুন এবং ফ্লাস্ক ডকুমেন্টেশন পর্যালোচনা করুন।

৩. ডেটা মডেল

এখানে কোনো পরিবর্তন নেই। পরবর্তী কোডল্যাবের মূল বিষয় হবে ডেটাস্টোর।

৪. হ্যান্ডলার

আপনি কোন ফ্রেমওয়ার্ক ( webapp2 বা Flask) ব্যবহার করছেন তা নির্বিশেষে, অ্যাপ্লিকেশনটি ৩টি কাজ করে:

  1. রুট পাথ ( / ) GET অনুরোধগুলি পরিচালনা করুন
  2. একটি ওয়েব পেজ 'ভিজিট' রেজিস্টার করুন ( Visit অবজেক্ট তৈরি/সংরক্ষণ করুন)
  3. পূর্ব-নির্ধারিত টেমপ্লেট ( index.html ) ব্যবহার করে সাম্প্রতিকতম ১০টি ভিজিট প্রদর্শন করুন।

webapp2 ফ্রেমওয়ার্ক একটি ক্লাস-ভিত্তিক এক্সিকিউশন মডেল ব্যবহার করে, যেখানে প্রতিটি সমর্থিত HTTP মেথডের জন্য হ্যান্ডলার তৈরি করা হয়। আমাদের এই সাধারণ ক্ষেত্রে, শুধুমাত্র GET মেথড রয়েছে, তাই একটি get() মেথড সংজ্ঞায়িত করা হয়েছে:

  • পূর্বে:
class MainHandler(webapp2.RequestHandler):
    def get(self):
        store_visit(self.request.remote_addr, self.request.user_agent)
        visits = fetch_visits(10) or ()  # empty sequence if None
        tmpl = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(tmpl, {'visits': visits}))

উপরে যেমন উল্লেখ করা হয়েছে, ফ্লাস্ক তার নিজস্ব রাউটিং করে। হ্যান্ডলার ক্লাসের পরিবর্তে, আপনি ফাংশন লেখেন এবং যে রাউটের জন্য সেগুলোকে কল করা হবে, তা দিয়ে সেগুলোকে ডেকোরেট করেন। ব্যবহারকারীরা ডেকোরেটর কলে ব্যবহৃত HTTP মেথডগুলো নির্দিষ্ট করে দিতে পারেন, যেমন, @app.route('/app/', methods=['GET', 'POST']) । যেহেতু ডিফল্ট হিসেবে শুধু GET (এবং পরোক্ষভাবে HEAD ) থাকে, তাই এটি বাদ দেওয়া যেতে পারে।

Flask-এ স্থানান্তরিত করার সময়, MainHandler ক্লাস এবং এর get() মেথডটিকে নিম্নলিখিত Flask রাউটিং ফাংশন দিয়ে প্রতিস্থাপন করুন:

  • পরে:
@app.route('/')
def root():
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10) or ()  # empty sequence if None
    return render_template('index.html', visits=visits)

অবশ্যই, এটি আপনার অ্যাপের প্রতিনিধিত্ব করে না, যা এই নমুনার চেয়ে নিশ্চিতভাবেই আরও জটিল হবে। এই টিউটোরিয়ালগুলোর একটি প্রধান লক্ষ্য হলো আপনাকে কাজ শুরু করতে সাহায্য করা, কিছু অভ্যাস গড়ে তোলা এবং অ্যাপ ইঞ্জিন-নির্দিষ্ট কোডে কোথায় পরিবর্তন করতে হবে তা বুঝতে সাহায্য করা। আপনি এই পরিবর্তনটি সঠিকভাবে করেছেন কিনা তা নিশ্চিত করতে, আপনার ফাইলটিকে মডিউল ১-এর main.py সাথে তুলনা করুন।

৫. সহায়ক ফাইল

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

.gcloudignore
.git
.gitignore
.hgignore
.hg/
*.pyc
*.pyo
__pycache__/
/setup.cfg
README.md

৬. এইচটিএমএল টেমপ্লেট ফাইল আপডেট করুন

১. টেমপ্লেট ফাইলটি সরান

বেসলাইন রিপো ফোল্ডারে (মডিউল ০), index.html টেমপ্লেট ফাইলটি অ্যাপ্লিকেশন ফাইলগুলোর সাথে একই ফোল্ডারে থাকে। যেহেতু Flask-এর জন্য HTML ফাইলগুলো একটি templates ফোল্ডারে রাখা প্রয়োজন, তাই আপনাকে অবশ্যই সেই ফোল্ডারটি তৈরি করতে হবে ( mkdir templates ) এবং index.html সেখানে সরাতে হবে। Linux বা Mac OS X-এর মতো POSIX-সম্মত সিস্টেমে, কমান্ডগুলো হবে:

mkdir templates
mv index.html templates

২. টেমপ্লেট ফাইল আপডেট করুন

একবার আপনি index.html templates সরিয়ে নিলে, এখন একটি ছোট কিন্তু প্রয়োজনীয় পরিবর্তন করার সময় এসেছে। চলুন, মূল টেমপ্লেট ফাইলটি সম্পূর্ণভাবে দেখে নেওয়া যাক:

<!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>

যেখানে webapp2 জ্যাঙ্গো টেমপ্লেট ব্যবহার করে যা visit.timestamp.ctime এর মতো কলযোগ্য ফাংশনগুলোকে বন্ধনী ( ) ছাড়াই কার্যকর করে, সেখানে Jinja2-এর জন্য স্পষ্টভাবে বন্ধনী প্রয়োজন হয়। যদিও এটিকে একটি সামান্য পরিবর্তন বলে মনে হতে পারে, Jinja টেমপ্লেটগুলো স্বয়ংক্রিয়ভাবে আরও বেশি শক্তিশালী, কারণ আপনি কল করার সময় আর্গুমেন্ট পাস করতে পারেন।

জ্যাঙ্গোতে, আপনাকে হয় একটি 'টেমপ্লেট ট্যাগ' তৈরি করতে হবে অথবা একটি ফিল্টার লিখতে হবে। এই ধারণাটি মাথায় রেখে, visit.timestamp.ctime কলটিতে একজোড়া প্রথম বন্ধনী যোগ করে index.html আপডেট করুন:

  • পূর্বে:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
  • পরে:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>

শুধুমাত্র এই পরিবর্তনটিই প্রয়োজন; বাকি সমস্ত মাইগ্রেশন কোডল্যাবের জন্য index.html এ আর কোনো অতিরিক্ত পরিবর্তনের প্রয়োজন নেই।

৭. সারসংক্ষেপ/পরিষ্কারকরণ

অ্যাপ্লিকেশন স্থাপন করুন

এই টিউটোরিয়ালের সমস্ত পরিবর্তন সম্পন্ন করার পর, আপনার অ্যাপ্লিকেশন ফোল্ডারের ফাইলগুলো মডিউল ১ রিপো ফোল্ডারের ফাইলের সাথে হুবহু (বা প্রায় হুবহু) মিলে যাবে। এখন ডিপ্লয় করুন এবং দেখুন যে আপনার মডিউল ১ ফ্লাস্ক অ্যাপ্লিকেশনটি মডিউল ০-এর webapp2 ভার্সনের মতোই চলছে।

মূল মডিউল ০ কোড ডেপ্লয় করার সময় আমরা আগে যেভাবে gcloud app deploy কমান্ডটি ব্যবহার করেছিলাম, সেভাবেই ব্যবহার করুন। অ্যাপটি প্রত্যাশিতভাবে কাজ করছে কিনা তা নিশ্চিত করতে, ওয়েব ব্রাউজার অথবা curl বা wget কমান্ডের মাধ্যমে PROJECT_ID.appspot.com এ অ্যাপটি অ্যাক্সেস করুন।

যদি আপনি কোনো ধরনের সার্ভার এরর পান, তার মানে সাধারণত আপনার পাইথন কোডে কোনো টাইপিংয়ের ভুল আছে। বিষয়টি খতিয়ে দেখতে আপনার অ্যাপ্লিকেশন লগগুলো দেখুন। এছাড়াও, আপনার ফাইলগুলোকে মডিউল ১ রিপোজিটরিতে (লিঙ্কটি ঠিক উপরেই দেওয়া আছে) থাকা ফাইলগুলোর সাথে মিলিয়ে দেখুন।

ঐচ্ছিক: পরিষ্কার করা

পরবর্তী মাইগ্রেশন কোডল্যাবে যাওয়ার জন্য প্রস্তুত না হওয়া পর্যন্ত বিল এড়ানোর জন্য কোডগুলো গুছিয়ে নিলে কেমন হয়? বিদ্যমান ডেভেলপার হিসেবে, আপনারা সম্ভবত অ্যাপ ইঞ্জিনের মূল্য নির্ধারণের তথ্য সম্পর্কে ইতিমধ্যেই অবগত আছেন।

ঐচ্ছিক: অ্যাপটি নিষ্ক্রিয় করুন

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

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

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

দুটি মাইগ্রেশন মডিউল আছে যা সম্পন্ন হওয়া মডিউল ১-এর কোড দিয়ে শুরু হয়, সেগুলো হলো মডিউল ২ এবং ৭।

  • মডিউল ২ (ডেটাস্টোর ব্যবহার করলে এটি আবশ্যক)
    • অ্যাপ ইঞ্জিন ndb থেকে ক্লাউড এনডিবি-তে মাইগ্রেট করুন
    • ক্লাউড এনডিবি-তে স্থানান্তরিত হওয়ার পর আরও অনেক বিকল্প উপলব্ধ হয়।
      • ক্লাউড রানে চালানোর জন্য আপনার অ্যাপকে কন্টেইনারাইজ করা
      • আপনার অ্যাপটিকে ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে আরও স্থানান্তর করা হচ্ছে
      • Firebase ফিচারগুলো অ্যাক্সেস করার জন্য আপনার অ্যাপটি ক্লাউড ফায়ারস্টোরে স্থানান্তর করা হচ্ছে
  • মডিউল ৭ (যদি আপনি [push] টাস্ক কিউ ব্যবহার করেন তবে এটি আবশ্যক)
    • অ্যাপ ইঞ্জিন (পুশ) taskqueue ব্যবহারের বিবরণ যোগ করুন
    • মডিউল ৮-এর ক্লাউড টাস্ক- এ স্থানান্তরের জন্য মডিউল ১ অ্যাপটিকে প্রস্তুত করে।

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

অ্যাপ ইঞ্জিন মাইগ্রেশন মডিউল কোডল্যাবস সমস্যা/মতামত

এই কোডল্যাবে কোনো সমস্যা পেলে, অভিযোগ জানানোর আগে অনুগ্রহ করে সমস্যাটি অনুসন্ধান করুন। নতুন সমস্যা অনুসন্ধান ও তৈরি করার লিঙ্ক:

অভিবাসন সম্পদ

মডিউল ০ (শুরু) এবং মডিউল ১ (শেষ)-এর রিপো ফোল্ডারগুলোর লিঙ্ক নিচের টেবিলে পাওয়া যাবে। এছাড়াও, সমস্ত অ্যাপ ইঞ্জিন মাইগ্রেশনের রিপো থেকেও এগুলো অ্যাক্সেস করা যাবে, যা আপনি ক্লোন করতে পারেন অথবা একটি জিপ ফাইল হিসেবে ডাউনলোড করতে পারেন।

কোডল্যাব

পাইথন ২

পাইথন ৩

মডিউল ০

কোড

(প্রযোজ্য নয়)

মডিউল ১

কোড

(প্রযোজ্য নয়)

অ্যাপ ইঞ্জিন রিসোর্স

এই নির্দিষ্ট মাইগ্রেশন সম্পর্কিত অতিরিক্ত তথ্যসূত্র নিচে দেওয়া হলো: