मॉड्यूल 1: App Engine webapp2 से फ़्लास्क पर माइग्रेट करना

1. खास जानकारी

कोडलैब (अपने हिसाब से इस्तेमाल किए जाने वाले टूल) की इस सीरीज़ का मकसद, Google App Engine (स्टैंडर्ड) डेवलपर की मदद करना है, ताकि वे माइग्रेशन की सीरीज़ के ज़रिए अपने ऐप्लिकेशन को आधुनिक बनाने में उनका मार्गदर्शन करें. सबसे ज़रूरी चरण है, बंडल की गई ओरिजनल सेवाओं का इस्तेमाल न करना, क्योंकि अगली-पीढ़ी की टेक्नोलॉजी के रनटाइम ज़्यादा सुविधाजनक होते हैं. इससे उपयोगकर्ताओं को सेवाओं के कई विकल्प मिलते हैं. रनटाइम के नए वर्शन का इस्तेमाल करने पर, Google Cloud के प्रॉडक्ट के साथ आसानी से इंटिग्रेट किया जा सकता है. इसके अलावा, अलग-अलग तरह की सेवाओं का इस्तेमाल किया जा सकता है और मौजूदा भाषाओं में इसका इस्तेमाल किया जा सकता है.

इस शुरुआती ट्यूटोरियल में, App Engine ऐप्लिकेशन में वेब फ़्रेमवर्क को आधुनिक बनाने के लिए, सबसे पहले माइग्रेशन के चरण बताए गए हैं: webapp2 से Flask पर जाना. अपने ऐप्लिकेशन में, रूटिंग को मैनेज करने वाले किसी भी वेब फ़्रेमवर्क का इस्तेमाल किया जा सकता है. हालांकि, इस ट्यूटोरियल के लिए हम Flusk का इस्तेमाल करते हैं, क्योंकि कम्यूनिटी इसका इस्तेमाल ज़्यादातर करती है.

आपको इनके बारे में जानकारी मिलेगी

  • तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करना (पहले से मौजूद या किसी दूसरी तरह से)
  • कॉन्फ़िगरेशन फ़ाइलें अपडेट करना
  • सामान्य ऐप्लिकेशन को webapp2 से फ़्लास्क पर माइग्रेट करें

आपको इन चीज़ों की ज़रूरत होगी

सर्वे

इस कोडलैब का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और कसरतों को पूरा करें

2. बैकग्राउंड

webapp फ़्रेमवर्क को तब बंडल किया गया था, जब 2008 में App Engine को Python 2.5 पर पहली बार लॉन्च किया गया था. कई सालों बाद, 2013 में 2.7 रनटाइम ने 2.5 को बंद कर दिया था. इसके बाद, इसे अगले webapp2 वर्शन से बदल दिया गया था.

हालांकि, webapp2 (दस्तावेज़ देखें) अब भी मौजूद है और इसका इस्तेमाल App Engine के बाहर, WSGI का पालन करने वाले वेब फ़्रेमवर्क के तौर पर किया जा सकता है. यह ऐप्लिकेशन में, सही कोड पर उपयोगकर्ता के अनुरोधों को खुद रूट नहीं करता. इसके बजाय, वेब ट्रैफ़िक को संबंधित "हैंडलर" पर रूट करने के लिए यह App Engine, कॉन्फ़िगरेशन फ़ाइलों, और डेवलपर पर निर्भर करता है. इसके अलावा, webapp2 के मुख्य फ़ायदे, App Engine की बंडल सेवाओं के साथ बहुत अच्छे से जुड़े हुए हैं. यह Python 3 पर काम करता है (इसके अलावा, इसी विषय से जुड़ी समस्या भी देखें) के तौर पर, अब यह सेवा बंद कर दी गई है.

यह मॉड्यूल कारोबारियों को एक सामान्य webapp2 ऐप्लिकेशन को फ़्लास्क में माइग्रेट करने का व्यावहारिक अनुभव देता है, जो App Engine के साथ काम करने वाला एक फ़्रेमवर्क और Google क्लाउड के बाहर की कई अन्य सेवाएं है, जिससे ऐप्लिकेशन कहीं ज़्यादा पोर्टेबल बन जाते हैं. अगर फ़्लास्क आपके ऐप्लिकेशन को ले जाने के लिए मनचाहा फ़्रेमवर्क नहीं है, तो आप तब तक दूसरा फ़्रेमवर्क चुन सकते हैं, जब तक वह अपना खुद का रूटिंग करता हो. यह कोडलैब, इन्फ़ॉर्मेशन टेक्नोलॉजी से जुड़े फ़ैसले लेने वाले लोगों (आईटीडीएम) और डेवलपर के बारे में बताता है, ताकि डेटा को दूसरी जगह भेजने के तरीके के बारे में जानकारी मिल सके. इससे आपको इस प्रोसेस के बारे में जानकारी मिलती है. इससे कोई फ़र्क़ नहीं पड़ता है कि आपने किस फ़्रेमवर्क पर माइग्रेट किया है.

इस माइग्रेशन के लिए, मुख्य चरण ये हैं:

  1. सेटअप/प्रीवर्क
  2. फ़्लास्क की तीसरे पक्ष की लाइब्रेरी जोड़ें
  3. ऐप्लिकेशन फ़ाइलें अपडेट करें
  4. एचटीएमएल टेंप्लेट फ़ाइल अपडेट करें

3. सेटअप/प्रीवर्क

ट्यूटोरियल के मुख्य हिस्से पर काम शुरू करने से पहले, आइए अपना प्रोजेक्ट सेटअप करें, कोड पाएं, फिर (फिर) आपको gcloud निर्देश के बारे में बताएं और बेसलाइन ऐप्लिकेशन डिप्लॉय करें, ताकि हमें पता चल सके कि हमने काम करने के लिए कोड का इस्तेमाल शुरू किया है.

1. प्रोजेक्ट सेटअप करें

मौजूदा डेवलपर के रूप में, आपका App Engine डैशबोर्ड संभावित रूप से पहले से ही दिखाता है कि आपने कौन-कौनसी सेवाएं चलाई हैं. इस ट्यूटोरियल के लिए, हमारा सुझाव है कि आप नया प्रोजेक्ट बनाएं या इस ट्यूटोरियल के लिए किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. पक्का करें कि प्रोजेक्ट में एक चालू बिलिंग खाता हो और App Engine (ऐप्लिकेशन) चालू हो.

2. बेसलाइन सैंपल ऐप्लिकेशन डाउनलोड करें

GAE माइग्रेशन रिपो में आपकी ज़रूरत के सभी कोड मौजूद हैं. इसका क्लोन बनाएं या इसकी ZIP फ़ाइल डाउनलोड करें. इस ट्यूटोरियल के लिए, आप मॉड्यूल 0 फ़ोल्डर (START) में कोड के साथ शुरुआत करेंगे, और जब आप ट्यूटोरियल पूरा कर लेंगे, तो आपका कोड मॉड्यूल 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 — अपना App Engine ऐप्लिकेशन डिप्लॉय करें

अगर आपने हाल ही में gcloud के साथ App Engine डेवलपमेंट का काम नहीं किया है, तो आपको अगले चरणों पर जाने से पहले सेट अप करने के लिए पहले चार कमांड (#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].

अगर आपको इसके बजाय Cloud Console का इस्तेमाल करना है, तो यूज़र इंटरफ़ेस को फ़ॉलो करके, नया प्रोजेक्ट बनाया जा सकता है. इसके अलावा, पहले से मौजूद किसी प्रोजेक्ट का इस्तेमाल भी किया जा सकता है. अपने प्रोजेक्ट के डैशबोर्ड पर, आपको प्रोजेक्ट की जानकारी वाला कार्ड दिखेगा, जिसमें प्रोजेक्ट का आईडी (प्रोजेक्ट का नाम और संख्या के साथ) दिखेगा:

प्रोजेक्ट जानकारी कार्ड

आखिरी निर्देश (#5), gcloud app deploy, आपके ऐप्लिकेशन को App Engine पर डिप्लॉय करने के लिए है. यह सिर्फ़ शुरुआत है. इसलिए, इसे अभी चलाना ज़रूरी नहीं है. हालांकि, हम मॉड्यूल 0 कोड के काम करने की पुष्टि करने के लिए, उसे इस्तेमाल नहीं करते. एक्ज़ीक्यूशन करने के बाद, वह भौगोलिक क्षेत्र चुनें जहां आपको ऐप्लिकेशन चलाना है (आम तौर पर, जहां आप रहते हैं). हालांकि, सेट करने के बाद इसे बदला नहीं जा सकता. इसके बाद, डिप्लॉयमेंट की बाकी जानकारी देखें. इसके पूरा हो जाने पर, आपको उस यूआरएल की सूचना दी जाएगी जिस पर आपके ऐप्लिकेशन को दिखाया जाएगा. यहां उन चीज़ों के बारे में खास जानकारी दी गई है जो आपको दिख सकते हैं:

$ 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

अगर आपने कुछ समय से App Engine का इस्तेमाल नहीं किया है, तो आप देख सकते हैं कि ओरिजनल डिप्लॉयमेंट appcfg.py update कमांड को gcloud app deploy ने बदल दिया है. gcloud app deploy के बारे में ज़्यादा जानने के लिए, उसका दस्तावेज़ पेज देखें.

हाल ही में, डिप्लॉय किए गए ऐप्लिकेशन में भी बदलाव हुआ है यूआरएल, http://PROJECT_ID.appspot.com से बदलकर http://PROJECT_ID.REG_ABBR.r.appspot.com किया गया. ज़्यादातर ऐप्लिकेशन समय के साथ नए फ़ॉर्मैट में बदल जाएंगे. यूआरएल फ़ॉर्मैट के बारे में ज़्यादा जानकारी के लिए, अनुरोध और रूटिंग दस्तावेज़ देखें.

ऐप्लिकेशन डिप्लॉय होने के बाद, नई विज़िट देखने के लिए ब्राउज़र को रीफ़्रेश करें. ऐसा कई बार किया जा सकता है:

विज़िटमी ऐप्लिकेशन

अगर आपका ऐप्लिकेशन नया है, तो आपको सिर्फ़ एक या कुछ ही विज़िट दिखेंगी.

4. फ़्लास्क की तीसरे पक्ष की लाइब्रेरी जोड़ें

Python 2 App Engine का रनटाइम, "बिल्ट-इन" का सेट उपलब्ध कराता है तीसरे पक्ष की लाइब्रेरी में, आपको बस उन्हें अपनी app.yaml फ़ाइल में इस्तेमाल करना होगा. हालांकि, इस माइग्रेशन के लिए उन्हें इस्तेमाल करने की ज़रूरत नहीं है, लेकिन ये मॉड्यूल 2 के लिए, अगले माइग्रेशन ट्यूटोरियल में होंगे.

तीसरे पक्ष की जिन लाइब्रेरी में पहले से नहीं है उन्हें requirements.txt नाम की फ़ाइल में तय किया जाना चाहिए. साथ ही, ऐप्लिकेशन कोड वाली उसी डायरेक्ट्री में स्थानीय तौर पर lib फ़ोल्डर में इंस्टॉल किया जाना चाहिए जहां हर चीज़ App Engine में अपलोड की जाती है. तीसरे पक्ष की लाइब्रेरी का बंडल बनाने के दस्तावेज़ में ज़्यादा जानकारी दी गई है.

Flusk जैसी कॉपी की गई लाइब्रेरी के लिए यह ज़रूरी है कि आप App Engine को 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 बनाएं

अगला चरण यह है कि App Engine, बाहरी तीसरे पक्ष की लाइब्रेरी की पहचान करे. इन कॉन्टेंट के साथ 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)

यह कोड ठीक वही काम करता है जो हमने पहले बताया था. इसका मतलब है कि कॉपी की गई लाइब्रेरी के लिए, App Engine को lib फ़ोल्डर पर पॉइंट किया जाता है.

3. पैकेज और डिपेंडेंसी इंस्टॉल करें

अब lib फ़ोल्डर बनाने और उसमें Flask और उसकी डिपेंडेंसी इंस्टॉल करने के लिए, 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. आयात

सभी Python फ़ाइलों की तरह ही इंपोर्ट सबसे पहले होता है. webapp2 फ़्रेमवर्क इंपोर्ट के बाद, ndb Datastore लाइब्रेरी का इस्तेमाल होता है. आखिर में, App Engine एक्सटेंशन, जो Django के फ़्लेवर वाले टेंप्लेट को प्रोसेस करता है. आपको यह जानकारी दिखेगी:

  • पहले:
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 का इस्तेमाल करने वाले ऐप्लिकेशन के लिए एक अरे (Python सूची) होना ज़रूरी है, जिसमें किसी भी Python फ़ाइल में मौजूद सभी रूट और हैंडलर की सूची हो (अन्य हो सकती है):

  • पहले:
app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

ध्यान रखें कि app.yaml हाई-लेवल रूटिंग करता है और अलग-अलग हैंडलर को कॉल कर सकता है. सैंपल ऐप्लिकेशन इतना आसान है कि सभी रास्ते main.py हैंडलर तक ले जाते हैं.

फ़्लास्क इस तरह रूटिंग टेबल का इस्तेमाल नहीं करता, इसलिए main.py में इन लाइनों को मिटाएं. फ़्लास्क को शुरू करने की भी ज़रूरत होती है, इसलिए इंपोर्ट के ठीक नीचे main.py के सबसे ऊपर पर इस लाइन को जोड़ें:

  • इसके बाद:
app = Flask(__name__)

फ़्लास्क में, फ़्रेमवर्क शुरू किया जाता है और फिर रूट तय करने के लिए डेकोरेटर का इस्तेमाल किया जाता है. साथ ही, रूट को फ़ंक्शन से जोड़ा जाता है, न कि क्लास या तरीकों से.

इस कोडलैब में फ़्लास्क ट्यूटोरियल शामिल करना मुश्किल है. इसलिए, Flask ट्यूटोरियल की मदद से काम करने के लिए कुछ समय निकालें और फ़्रेमवर्क को बेहतर तरीके से समझने के लिए, Flask दस्तावेज़ देखें.

3. डेटा मॉडल

यहां कोई बदलाव नहीं है. अगले कोडलैब में, Datastore पर फ़ोकस किया जाएगा.

4. हैंडलर

आप चाहे किसी भी फ़्रेमवर्क (webapp2 या फ़्लास्क) का इस्तेमाल करें, यह ऐप्लिकेशन तीन काम करता है:

  1. रूट पाथ (/) GET अनुरोधों को मैनेज करें
  2. वेब पेज "visit" को रजिस्टर करें (Visit ऑब्जेक्ट बनाएं/सेव करें)
  3. सबसे हाल की 10 सबसे हाल की विज़िट (पहले से तय टेंप्लेट के साथ index.html) दिखाएं

webapp2 फ़्रेमवर्क, क्लास पर आधारित एक्ज़ीक्यूशन मॉडल का इस्तेमाल करता है. इसमें इस्तेमाल किए जा सकने वाले हर एचटीटीपी तरीके के लिए हैंडलर बनाए जाते हैं. आसान मामले में, हमारे पास सिर्फ़ 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}))

जैसा कि ऊपर बताया गया है, फ़्लास्क अपनी रूटिंग खुद करता है. हैंडलर क्लास के बजाय, फ़ंक्शन लिखें और उन्हें उस रूट से सजाएं जिसके लिए उन्हें कॉल किया जाना चाहिए. उपयोगकर्ता, डेकोरेटर कॉल में हैंडल किए जाने वाले एचटीटीपी तरीकों के बारे में बता सकते हैं, जैसे कि @app.route('/app/', methods=['GET', 'POST']). डिफ़ॉल्ट तौर पर सिर्फ़ GET (और ज़ाहिर तौर पर HEAD) है, इसलिए इसे बंद किया जा सकता है.

Flusk में माइग्रेट करने के दौरान, 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)

बेशक यह आपके ऐप्लिकेशन का प्रतिनिधित्व नहीं करता है जो निश्चित रूप से इस नमूने से ज़्यादा जटिल होगा. इन ट्यूटोरियल का एक मुख्य मकसद है कि आप शुरुआत कर सकें और उनमें से कुछ "मसल मेमोरी" बना सकें, साथ ही, यह भी समझा जा सकता है कि App Engine के हिसाब से बने कोड में बदलाव कहां करने हैं. आपने यह बदलाव सही तरीके से किया है, इसकी पुष्टि करने के लिए, मॉड्यूल 1 main.py से अपने मॉड्यूल की तुलना करें.

5. सहायक फ़ाइलें

.gcloudignore फ़ाइल में कोई बदलाव नहीं है. इसका मकसद उन फ़ाइलों के बारे में बताना है जिन्हें App Engine पर डिप्लॉय नहीं किया जाना चाहिए. ये ऐसी फ़ाइलें हैं जो ऐप्लिकेशन को डिप्लॉय और लागू करने के लिए ज़रूरी नहीं हैं. इनमें सहायक Python, सोर्स कंट्रोल, रेपो बॉयलरप्लेट, और दूसरी फ़ाइलों के अलावा, और भी चीज़ें शामिल हो सकती हैं. हमारा .gcloudignore कुछ ऐसा दिखता है (कम शब्दों में जानकारी देने के लिए, टिप्पणियों को हटा दिया जाता है):

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

6. एचटीएमएल टेंप्लेट फ़ाइल अपडेट करें

1. टेंप्लेट फ़ाइल ले जाएं

बेसलाइन रेपो फ़ोल्डर (मॉड्यूल 0) में, index.html टेंप्लेट फ़ाइल उसी फ़ोल्डर में है जिसमें ऐप्लिकेशन फ़ाइलें हैं. चूंकि फ़्लास्क को templates फ़ोल्डर में रखी गई एचटीएमएल फ़ाइलों की ज़रूरत होती है, इसलिए आपको वह फ़ोल्डर (mkdir templates) बनाना होगा और index.html को उसमें ले जाना होगा. Linux या Mac OS X जैसे 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 जैसे कॉलेबल को एक्ज़ीक्यूट करते हैं. वहीं, Jinja2 को इसके लिए साफ़ तौर पर ज़रूरत होती है. यह मामूली सा बदलाव जैसा लगता है, लेकिन Jinja टेंप्लेट सबसे ज़्यादा कारगर साबित होते हैं, क्योंकि इनसे कॉल में आर्ग्युमेंट पास किए जा सकते हैं.

Django में, आपको या तो "टेंप्लेट टैग" बनाना होगा या फ़िल्टर लिखें. इस जानकारी के साथ, 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 वर्शन की तरह ही काम करता है.

gcloud app deploy कमांड का इस्तेमाल, उसी तरह करें जैसा हमने पहले ओरिजनल मॉड्यूल 0 कोड को डिप्लॉय करते समय किया था. ऐप्लिकेशन को PROJECT_ID.appspot.com पर ऐक्सेस करें. इससे यह पुष्टि की जा सकती है कि ऐप्लिकेशन उम्मीद के मुताबिक काम कर रहा है या नहीं. इसे किसी वेब ब्राउज़र, curl या wget कमांड से ऐक्सेस किया जा सकता है.

अगर आपको सर्वर की कोई गड़बड़ी मिलती है, तो इसका मतलब है कि आपके Python कोड में टाइपिंग से जुड़ी कोई गड़बड़ी हो सकती है. इस समस्या की जांच करने के लिए, अपने ऐप्लिकेशन लॉग पर एक नज़र डालें. साथ ही, अपनी फ़ाइलों की तुलना मॉड्यूल 1 रेपो में मौजूद फ़ाइलों से करें (ऊपर दिया गया लिंक).

ज़रूरी नहीं: स्टोरेज खाली करें

जब तक आप अगले माइग्रेशन कोडलैब पर जाने के लिए तैयार नहीं हो जाते, तब तक बिलिंग से बचने के लिए क्लीन अप करने के बारे में क्या करें? मौजूदा डेवलपर के तौर पर, आपको App Engine की कीमत की जानकारी के बारे में अप-टू-डेट जानकारी है.

ज़रूरी नहीं: ऐप्लिकेशन बंद करना

अगर आप अभी अगले ट्यूटोरियल पर जाने के लिए तैयार नहीं हैं, तो शुल्क देने से बचने के लिए, अपना ऐप्लिकेशन बंद करें. जब आप अगले कोडलैब पर जाने के लिए तैयार हों, तो उसे फिर से चालू किया जा सकता है. बंद होने पर, आपके ऐप्लिकेशन को शुल्क देने के लिए कोई ट्रैफ़िक नहीं मिलेगा. हालांकि, डेटा स्टोर के इस्तेमाल को तब भी खर्च किया जा सकता है, जब इसका शुल्क मुफ़्त में मिलने वाले कोटा से ज़्यादा हो. इसलिए, इसे इतना मिटा दें कि इस सीमा के अंदर आने में आपको कोई परेशानी न हो.

दूसरी ओर, अगर आपको माइग्रेशन जारी नहीं रखना है और सब कुछ पूरी तरह से मिटाना है, तो अपना प्रोजेक्ट बंद करें.

अगले चरण

इस प्लैटफ़ॉर्म पर दो माइग्रेशन मॉड्यूल उपलब्ध हैं, जिनमें मॉड्यूल 1 कोड वाले मॉड्यूल के साथ-साथ दूसरे मॉड्यूल 2 और 7 को चालू किया गया है:

  • मॉड्यूल 2 (अगर आप Datastore का इस्तेमाल करते हैं तो ज़रूरी है)
    • App Engine ndb से Cloud NDB पर माइग्रेट करें
    • क्लाउड एनडीबी पर स्विच करने के बाद, कई अन्य विकल्प उपलब्ध हो जाते हैं
      • अपने ऐप्लिकेशन को Cloud Run पर चलाने के लिए कंटेनर बनाना
      • अपने ऐप्लिकेशन को Cloud Datastore क्लाइंट लाइब्रेरी में माइग्रेट करना
      • Firebase की सुविधाएं ऐक्सेस करने के लिए, अपने ऐप्लिकेशन को Cloud Firestore पर माइग्रेट करना
  • मॉड्यूल 7 (अगर आप [push] काम की सूचियों का इस्तेमाल करते हैं, तो यह ज़रूरी है)
    • App Engine (पुश) taskqueue का इस्तेमाल जोड़ें
    • मॉड्यूल 8 में, Cloud Tasks पर माइग्रेट करने के लिए, मॉड्यूल 1 ऐप्लिकेशन तैयार किया जाता है

8. अन्य संसाधन

App Engine माइग्रेशन मॉड्यूल कोडलैब से जुड़ी समस्याएं/सुझाव

अगर आपको इस कोडलैब के साथ कोई समस्या मिलती है, तो कृपया आवेदन करने से पहले अपनी समस्या का पता लगाएं. खोजने और नई समस्याएं बनाने के लिए लिंक:

माइग्रेशन के लिए संसाधन

यहां दी गई टेबल में, मॉड्यूल 0 (START) और मॉड्यूल 1 (FINISH) के रेपो फ़ोल्डर के लिंक दिए गए हैं. उन्हें सभी App Engine माइग्रेशन के लिए रेपो से भी ऐक्सेस किया जा सकता है, जिसका क्लोन बनाया जा सकता है या ZIP फ़ाइल डाउनलोड की जा सकती है.

Codelab

Python 2

Python 3

मॉड्यूल 0

कोड

(लागू नहीं)

मॉड्यूल 1

कोड

(लागू नहीं)

App Engine के संसाधन

इस खास माइग्रेशन से जुड़े अतिरिक्त संसाधन नीचे दिए गए हैं: