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

1. ওভারভিউ

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

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

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

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

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

সমীক্ষা

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

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

2. পটভূমি

2008 সালে পাইথন 2.5 এ অ্যাপ ইঞ্জিন প্রথম চালু হলে webapp ফ্রেমওয়ার্কটি বান্ডেল করা হয়েছিল। কয়েক বছর পরে এটি উত্তরাধিকারী webapp2 দ্বারা প্রতিস্থাপিত হয়েছিল যখন 2.7 রানটাইম 2.5 2013 সালে অবমূল্যায়িত হয়েছিল

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

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

এই মাইগ্রেশনের প্রাথমিক ধাপগুলি হল:

  1. সেটআপ/প্রিওয়ার্ক
  2. ফ্লাস্ক 3য় পক্ষের লাইব্রেরি যোগ করুন
  3. অ্যাপ্লিকেশন ফাইল আপডেট করুন
  4. HTML টেমপ্লেট ফাইল আপডেট করুন

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

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

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

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

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

GAE মাইগ্রেশন রেপোতে আপনার প্রয়োজনীয় সমস্ত কোড রয়েছে৷ এটি ক্লোন করুন বা এটির জিপ ফাইল ডাউনলোড করুন। এই টিউটোরিয়ালটির জন্য, আপনি মডিউল 0 ফোল্ডারে (স্টার্ট) কোড দিয়ে শুরু করবেন এবং যখন আপনি টিউটোরিয়ালটি সম্পূর্ণ করবেন, তখন আপনার কোডটি মডিউল 1 ফোল্ডারের (FINISH) সাথে মেলে। যদি না হয়, পার্থক্যগুলি পরীক্ষা করে দেখুন যাতে আপনি পরবর্তী ল্যাবে যেতে পারেন।

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

$ ls
app.yaml        index.html      main.py

3. (পুনরায়) 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 এর সাথে অ্যাপ ইঞ্জিন ডেভেলপমেন্ট না করে থাকেন, তাহলে পরবর্তী ধাপে যাওয়ার আগে সেট আপ করার জন্য আপনাকে প্রথম চারটি কমান্ড (#1-#4) চালাতে হবে। আসুন এই কমান্ডগুলির একটি দ্রুত ওভারভিউ করি।

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

$ 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 auth login ব্যবহার করে gcloud কমান্ডের জন্য নিজেকে প্রমাণীকরণ করুন যা আপনি এগিয়ে যেতে ইস্যু করবেন:

$ 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 , অ্যাপ ইঞ্জিনে আপনার অ্যাপ স্থাপনের জন্য। যেহেতু আমরা সবেমাত্র শুরু করছি, এখন এটি চালানো ঐচ্ছিক, তবে আমরা অবশ্যই এটি কাজ করে তা নিশ্চিত করতে মডিউল 0 কোড স্থাপন করা নিরুৎসাহিত করব না। কার্যকর করার পরে, আপনি যে ভৌগলিক অঞ্চলে অ্যাপটি চালাতে চান তা নির্বাচন করুন (সাধারণত যেখানে আপনি অবস্থান করছেন)। তবে একবার সেট করে পরিবর্তন করা যাবে না। তারপর স্থাপনার বাকি তথ্য দেখুন। এটি সম্পূর্ণ হয়ে গেলে, আপনার অ্যাপটি যে 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 এ টুইক করা হয়েছে। বেশিরভাগ অ্যাপগুলি অবশেষে নতুন ফর্ম্যাটে রূপান্তরিত হবে। অনুরোধ এবং রাউটিং ডকুমেন্টেশনে ইউআরএল ফর্ম্যাট সম্পর্কে আরও তথ্য।

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

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

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

4. ফ্লাস্ক 3য় পক্ষের লাইব্রেরি যোগ করুন

Python 2 অ্যাপ ইঞ্জিন রানটাইম "বিল্ট-ইন" তৃতীয় পক্ষের লাইব্রেরির একটি সেট সরবরাহ করে যেখানে আপনাকে যা করতে হবে তা হল ব্যবহার করার জন্য আপনার app.yaml ফাইলে সেগুলি নির্দিষ্ট করুন৷ যদিও এই মাইগ্রেশনের জন্য তাদের ব্যবহারের প্রয়োজন নেই, তারা পরবর্তী মাইগ্রেশন টিউটোরিয়ালে থাকবে (মডিউল 2-এর জন্য)।

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

ফ্লাস্কের মতো অনুলিপি করা লাইব্রেরিগুলির প্রয়োজন হয় যে আপনি অ্যাপ ইঞ্জিনকে appengine_config.py কনফিগারেশন ফাইল ব্যবহার করে lib ফোল্ডারে তাদের সন্ধান করতে বলুন। appengine_config.py কনফিগারেশন ফাইলটি requirements.txt এবং lib হিসাবে একই শীর্ষ-স্তরের অ্যাপ্লিকেশন ফোল্ডারে স্থাপন করা হয়েছে। টিউটোরিয়ালের এই অংশে, আপনি করবেন:

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

1. requirements.txt তৈরি করুন

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

Flask==1.1.2

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

2. 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 ফোল্ডারে নির্দেশ করে।

3. প্যাকেজ(গুলি) এবং নির্ভরতা ইনস্টল করুন৷

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

$ 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/

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

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

1. আমদানি

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

  • আগে:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template

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

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

2. স্টার্টআপ

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

  • আগে:
app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

মনে রাখবেন যে app.yaml উচ্চ-স্তরের রাউটিং করে এবং বিভিন্ন হ্যান্ডলারকে কল করতে পারে। নমুনা অ্যাপটি যথেষ্ট সহজ যে সমস্ত রুট main.py হ্যান্ডলারে আসে।

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

  • পরে:
app = Flask(__name__)

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

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

3. ডেটা মডেল

এখানে কোন পরিবর্তন নেই. ডেটাস্টোর পরবর্তী কোডল্যাবের ফোকাস হবে।

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

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

  1. রুট পাথ পরিচালনা করুন ( / ) অনুরোধ পান
  2. একটি ওয়েব পেজ রেজিস্টার করুন "ভিজিট" (তৈরি/স্টোর Visit অবজেক্ট)
  3. শীর্ষ 10টি সাম্প্রতিক ভিজিট প্রদর্শন করুন (একটি পূর্ব-নির্ধারিত টেমপ্লেট, 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 ), এটি ছেড়ে দেওয়া যেতে পারে।

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

  • পরে:
@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)

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

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

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

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

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

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

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

mkdir templates
mv index.html templates

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

একবার আপনি 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 Django টেমপ্লেট ব্যবহার করে যা বন্ধনী ( ) ছাড়া visit.timestamp.ctime এর মতো কলেবলগুলি চালায়, জিনজা2-এর স্পষ্টভাবে তাদের প্রয়োজন। যদিও এটি একটি ছোটখাট পরিবর্তনের মতো শোনাচ্ছে, জিনজা টেমপ্লেটগুলি আরও শক্তিশালী কারণ আপনি কলগুলিতে আর্গুমেন্ট পাস করতে পারেন৷

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

  • আগে:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
  • পরে:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>

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

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

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

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

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

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

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

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

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

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

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

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

দুটি মাইগ্রেশন মডিউল রয়েছে যা সম্পূর্ণ মডিউল 1 কোড, মডিউল 2 এবং 7 দিয়ে শুরু হয়:

  • মডিউল 2 (আপনি ডেটাস্টোর ব্যবহার করলে প্রয়োজনীয়)
    • App Engine ndb থেকে Cloud NDB-তে স্থানান্তর করুন
    • ক্লাউড এনডিবিতে স্যুইচ করার পরে, অন্যান্য অনেক বিকল্প উপলব্ধ হয়ে যায়
      • ক্লাউড রানে চালানোর জন্য আপনার অ্যাপকে ধারণ করা হচ্ছে
      • আপনার অ্যাপটিকে আরও ক্লাউড ডেটাস্টোর ক্লায়েন্ট লাইব্রেরিতে স্থানান্তর করা হচ্ছে
      • Firebase বৈশিষ্ট্যগুলি অ্যাক্সেস করতে আপনার অ্যাপটিকে ক্লাউড ফায়ারস্টোরে স্থানান্তর করা হচ্ছে
  • মডিউল 7 (আপনি যদি [পুশ] টাস্ক সারি ব্যবহার করেন তবে প্রয়োজনীয়)
    • অ্যাপ ইঞ্জিন (পুশ) taskqueue ব্যবহার যোগ করুন
    • মডিউল 8-এ ক্লাউড টাস্কে মাইগ্রেশনের জন্য মডিউল 1 অ্যাপ প্রস্তুত করে

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

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

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

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

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

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 0

কোড

(n/a)

মডিউল 1

কোড

(n/a)

অ্যাপ ইঞ্জিন সম্পদ

নীচে এই নির্দিষ্ট মাইগ্রেশন সম্পর্কিত অতিরিক্ত সংস্থান রয়েছে: