1. खास जानकारी
कोडलैब की इस सीरीज़ में, Google App Engine (स्टैंडर्ड) डेवलपर को अपने ऐप्लिकेशन को बेहतर बनाने में मदद मिलेगी. इसके लिए, उन्हें माइग्रेशन की सीरीज़ के बारे में जानकारी दी जाएगी. ये कोडलैब, डेवलपर अपनी सुविधा के हिसाब से कभी भी ऐक्सेस कर सकते हैं. साथ ही, इनमें प्रैक्टिकल ट्यूटोरियल भी शामिल हैं. सबसे ज़रूरी कदम यह है कि ओरिजनल रनटाइम बंडल की गई सेवाओं को बंद कर दिया जाए. ऐसा इसलिए, क्योंकि अगली जनरेशन के रनटाइम ज़्यादा बेहतर होते हैं. इनसे उपयोगकर्ताओं को सेवा के ज़्यादा विकल्प मिलते हैं. नई जनरेशन के रनटाइम पर माइग्रेट करने से, Google Cloud के प्रॉडक्ट के साथ आसानी से इंटिग्रेट किया जा सकता है. साथ ही, ज़्यादा सेवाओं का इस्तेमाल किया जा सकता है और भाषा के मौजूदा वर्शन का इस्तेमाल किया जा सकता है.
इस शुरुआती ट्यूटोरियल में, App Engine ऐप्लिकेशन में वेब फ़्रेमवर्क को मॉडर्न बनाने के लिए, माइग्रेट करने के शुरुआती चरण दिखाए गए हैं. जैसे, webapp2 से Flask पर माइग्रेट करना. अपने ऐप्लिकेशन में, राउटिंग को मैनेज करने वाले किसी भी वेब फ़्रेमवर्क का इस्तेमाल किया जा सकता है. हालांकि, इस ट्यूटोरियल के लिए हम Flask का इस्तेमाल करते हैं, क्योंकि इसका इस्तेमाल कम्यूनिटी में बड़े पैमाने पर किया जाता है.
आपको इनके बारे में जानकारी मिलेगी
- तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करना (पहले से मौजूद या अन्य)
- कॉन्फ़िगरेशन फ़ाइलें अपडेट करना
- किसी सामान्य ऐप्लिकेशन को
webapp2से Flask पर माइग्रेट करना
आपको इन चीज़ों की ज़रूरत होगी
- Google Cloud Platform प्रोजेक्ट जिसमें ये शामिल हों:
- Python की बुनियादी जानकारी
- Linux की बुनियादी कमांड के बारे में जानकारी होना
- App Engine ऐप्लिकेशन डेवलप और डिप्लॉय करने की बुनियादी जानकारी
सर्वे
इस कोडलैब का इस्तेमाल कैसे किया जाएगा?
2. बैकग्राउंड
webapp फ़्रेमवर्क को App Engine के साथ बंडल किया गया था. App Engine को पहली बार 2008 में Python 2.5 पर लॉन्च किया गया था. साल 2013 में, 2.7 रनटाइम ने 2.5 को बंद कर दिया. इसके बाद, webapp2 को इसके उत्तराधिकारी के तौर पर लॉन्च किया गया.
webapp2 (दस्तावेज़ देखें) अब भी मौजूद है. इसका इस्तेमाल App Engine के बाहर, WSGI के साथ काम करने वाले वेब फ़्रेमवर्क के तौर पर किया जा सकता है. हालांकि, यह ऐप्लिकेशन में उपयोगकर्ता के अनुरोधों को सही कोड पर अपने-आप रूट नहीं करता है. इसके बजाय, यह वेब ट्रैफ़िक को उससे जुड़े "हैंडलर" पर रूट करने के लिए, App Engine, कॉन्फ़िगरेशन फ़ाइलों, और डेवलपर पर निर्भर करता है. इसके अलावा, webapp2 के मुख्य फ़ायदे, App Engine की बंडल की गई सेवाओं से जुड़े हैं. इसलिए, इसे बंद कर दिया गया है. हालांकि, यह Python 3 पर काम करता है. इससे जुड़ी समस्या भी देखें.
इस मॉड्यूल में, webapp2 ऐप्लिकेशन को Flask पर माइग्रेट करने के बारे में बताया गया है. Flask, App Engine और Google Cloud के बाहर की कई अन्य सेवाओं के साथ काम करता है. इससे ऐप्लिकेशन को आसानी से एक जगह से दूसरी जगह ले जाया जा सकता है. अगर आपको अपने ऐप्लिकेशन को Flask पर माइग्रेट नहीं करना है, तो कोई दूसरा फ़्रेमवर्क चुना जा सकता है. हालांकि, यह ज़रूरी है कि वह फ़्रेमवर्क खुद राउटिंग करता हो. इस कोडलैब में, सूचना प्रौद्योगिकी से जुड़े फ़ैसले लेने वाले लोगों (आईटीडीएम) और डेवलपर को माइग्रेट करने के चरणों के बारे में बताया गया है. इससे आपको इस प्रोसेस के बारे में जानकारी मिल सकती है. भले ही, आपको किसी भी फ़्रेमवर्क पर माइग्रेट करना हो.
इस माइग्रेशन के लिए मुख्य चरण ये हैं:
- सेटअप/प्रीवर्क
- Flask की तीसरे पक्ष की लाइब्रेरी जोड़ना
- ऐप्लिकेशन की फ़ाइलें अपडेट करना
- एचटीएमएल टेंप्लेट फ़ाइल अपडेट करना
3. सेटअप/प्रीवर्क
ट्यूटोरियल के मुख्य हिस्से पर जाने से पहले, आइए हम अपना प्रोजेक्ट सेट अप करें, कोड पाएं, और फिर आपको gcloud कमांड के बारे में (फिर से) बताएं. इसके बाद, बेसलाइन ऐप्लिकेशन को डिप्लॉय करें, ताकि हमें पता चल सके कि हमने काम करने वाले कोड से शुरुआत की है.
1. प्रोजेक्ट सेट अप करना
मौजूदा डेवलपर के तौर पर, आपके App Engine डैशबोर्ड में शायद पहले से ही यह जानकारी दिख रही हो कि कौनसी सेवाएं चालू हैं. इस ट्यूटोरियल के लिए, हमारा सुझाव है कि आप एक नया प्रोजेक्ट बनाएं या इस ट्यूटोरियल के लिए किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. पक्का करें कि प्रोजेक्ट में, बिलिंग के लिए ऐक्टिव खाता हो और App Engine (ऐप्लिकेशन) चालू हो.
2. बेसलाइन का सैंपल ऐप्लिकेशन डाउनलोड करें
GAE माइग्रेशन रेपो में, आपको ज़रूरी कोड मिल जाएगा. इसे क्लोन करें या इसकी ZIP फ़ाइल डाउनलोड करें. इस ट्यूटोरियल के लिए, आपको Module 0 फ़ोल्डर (START) में मौजूद कोड से शुरुआत करनी होगी. ट्यूटोरियल पूरा होने के बाद, आपका कोड Module 1 फ़ोल्डर (FINISH) में मौजूद कोड से मेल खाना चाहिए. अगर ऐसा नहीं है, तो दोनों के बीच के अंतर को देखें, ताकि आप अगले लैब पर जा सकें.
- START: Module 0 code
- पूरा करें: मॉड्यूल 1 का कोड
- पूरी रीपो (क्लोन करने या ZIP फ़ाइल डाउनलोड करने के लिए)
मॉड्यूल 0 फ़ोल्डर में ऐसी फ़ाइलें होनी चाहिए. इन्हें POSIX ls कमांड के साथ दिखाया गया है:
$ ls
app.yaml index.html main.py
3. gcloud कमांड के बारे में फिर से जानें
अगर आपके पास अब तक अपने कंप्यूटर पर gcloud कमांड नहीं है, तो Google Cloud SDK इंस्टॉल करें. साथ ही, पक्का करें कि gcloud आपके एक्ज़ीक्यूशन पाथ का हिस्सा हो. इसके अलावा, gcloud की इन कमांड के बारे में जानें:
gcloud components update— Google Cloud SDK अपडेट करेंgcloud auth login— क्रेडेंशियल वाले खाते में लॉग इन करेंgcloud config list— GCP प्रोजेक्ट की कॉन्फ़िगरेशन सेटिंग की सूची बनाएंgcloud config set project PROJECT_ID— GCP प्रोजेक्ट का आईडी सेट करें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 के लिए अपनी पहचान की पुष्टि करने के लिए 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 पर ऐप्लिकेशन डिप्लॉय करने के लिए किया जाता है. अभी हम इस सुविधा को लॉन्च कर रहे हैं. इसलिए, इसे अभी चलाना ज़रूरी नहीं है. हालांकि, हम यह पुष्टि करने के लिए Module 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. Flask की तीसरे पक्ष की लाइब्रेरी जोड़ना
Python 2 App Engine रनटाइम, "बिल्ट-इन" तीसरे पक्ष की लाइब्रेरी का एक सेट उपलब्ध कराता है. इनका इस्तेमाल करने के लिए, आपको सिर्फ़ इन्हें अपनी app.yaml फ़ाइल में शामिल करना होता है. इस माइग्रेशन के लिए इनका इस्तेमाल करना ज़रूरी नहीं है. हालांकि, ये अगले माइग्रेशन ट्यूटोरियल (मॉड्यूल 2 के लिए) में शामिल होंगे.
तीसरे पक्ष की ऐसी लाइब्रेरी जो पहले से मौजूद नहीं हैं उन्हें requirements.txt नाम की फ़ाइल में शामिल किया जाना चाहिए. साथ ही, उन्हें lib फ़ोल्डर में स्थानीय तौर पर इंस्टॉल किया जाना चाहिए. यह फ़ोल्डर, ऐप्लिकेशन कोड वाली उसी डायरेक्ट्री में होना चाहिए जहां सभी फ़ाइलें App Engine पर अपलोड की जाती हैं. ज़्यादा जानकारी के लिए, तीसरे पक्ष की लाइब्रेरी बंडल करने से जुड़ा दस्तावेज़ देखें.
Flask जैसी कॉपी की गई लाइब्रेरी के लिए, आपको App Engine को यह बताना होगा कि वह lib फ़ोल्डर में उन्हें खोजे. इसके लिए, appengine_config.py कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करें. appengine_config.py कॉन्फ़िगरेशन फ़ाइल को उसी टॉप-लेवल ऐप्लिकेशन फ़ोल्डर में रखा जाता है जिसमें requirements.txt और lib को रखा जाता है. ट्यूटोरियल के इस हिस्से में, आपको इनके बारे में जानकारी मिलेगी:
requirements.txtबनाएं (कॉपी की गई [नॉन-बिल्ट-इन] तीसरे पक्ष की लाइब्रेरी के बारे में बताएं)appengine_config.pyबनाएं (तीसरे पक्ष की लाइब्रेरी को पहचानें)- तीसरे पक्ष के पैकेज और डिपेंडेंसी इंस्टॉल करना
1. requirements.txt बनाएं
अपने पैकेज के बारे में बताने के लिए, requirements.txt फ़ाइल बनाएं. हमारे मामले में, Flask तीसरे पक्ष की वह लाइब्रेरी है जिसकी ज़रूरत है. यह जवाब लिखते समय, इसका नया वर्शन 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 फ़ोल्डर बनाने के लिए, pip install कमांड चलाएं. साथ ही, 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/
5. ऐप्लिकेशन की फ़ाइलें अपडेट करना
अब ऐप्लिकेशन फ़ाइल को अपडेट करते हैं, main.py.
1. आयात
सभी Python फ़ाइलों की तरह, इसमें भी इंपोर्ट सबसे पहले होता है. webapp2 फ़्रेमवर्क इंपोर्ट के बाद, ndb Datastore लाइब्रेरी इंपोर्ट की जाती है. इसके बाद, App Engine एक्सटेंशन इंपोर्ट किया जाता है, जो Django-फ़्लेवर्ड टेंप्लेट को प्रोसेस करता है. आपको यह जानकारी दिखेगी:
- BEFORE:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template
Flask पर माइग्रेट करते समय, Flask और टेंप्लेट रेंडरर, दोनों को एक साथ इंपोर्ट किया जाता है. webapp2 से जुड़े इंपोर्ट के पेयर को मिटाएं और उन्हें इस तरह बदलें (ndb इंपोर्ट को वैसे ही रहने दें):
- AFTER:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
2. स्टार्टअप
webapp2 का इस्तेमाल करने वाले ऐप्लिकेशन के लिए, एक ऐसे ऐरे (Python लिस्ट) की ज़रूरत होती है जिसमें किसी भी Python फ़ाइल के सभी रास्तों और हैंडलर की सूची दी गई हो. हालांकि, इसमें अन्य फ़ाइलें भी शामिल हो सकती हैं:
- BEFORE:
app = webapp2.WSGIApplication([
('/', MainHandler),
], debug=True)
ध्यान रखें कि app.yaml, हायर-लेवल राउटिंग करता है और अलग-अलग हैंडलर को कॉल कर सकता है. सैंपल ऐप्लिकेशन इतना आसान है कि सभी रूट main.py हैंडलर पर आते हैं.
Flask इस तरह की राउटिंग टेबल का इस्तेमाल नहीं करता है. इसलिए, main.py में इन लाइनों को मिटा दें. Flask को भी शुरू करने की ज़रूरत होती है. इसलिए, main.py में इंपोर्ट के ठीक नीचे, सबसे ऊपर यह लाइन जोड़ें:
- AFTER:
app = Flask(__name__)
Flask में, फ़्रेमवर्क को शुरू किया जाता है. इसके बाद, डेकोरेटर का इस्तेमाल करके रास्तों को तय किया जाता है. साथ ही, रास्तों को फ़ंक्शन के साथ जोड़ा जाता है, न कि क्लास या तरीकों के साथ.
इस कोडलैब में Flask ट्यूटोरियल शामिल नहीं किया गया है. इसलिए, Flask ट्यूटोरियल को पूरा करें और Flask के दस्तावेज़ पढ़ें, ताकि आपको इस फ़्रेमवर्क के बारे में ज़्यादा जानकारी मिल सके.
3. डेटा मॉडल
यहां कोई बदलाव नहीं किया गया है. अगले कोडलैब में, Datastore पर फ़ोकस किया जाएगा.
4. हैंडलर
आपने जिस भी फ़्रेमवर्क (webapp2 या Flask) का इस्तेमाल किया है, यह ऐप्लिकेशन तीन काम करता है:
- रूट पाथ (
/) के लिए जीईटी अनुरोधों को हैंडल करना - यह कुकी, किसी वेब पेज पर "विज़िट" को रजिस्टर करती है. साथ ही,
Visitऑब्जेक्ट को बनाती/स्टोर करती है - सबसे ज़्यादा देखी गई 10 हालिया विज़िट दिखाएं (पहले से तय किए गए टेंप्लेट,
index.htmlके साथ)
webapp2 फ़्रेमवर्क, क्लास पर आधारित एक्ज़ीक्यूशन मॉडल का इस्तेमाल करता है. इसमें हर एचटीटीपी तरीके के लिए हैंडलर बनाए जाते हैं. हमारे आसान उदाहरण में, हमारे पास सिर्फ़ GET है. इसलिए, get() तरीका तय किया गया है:
- BEFORE:
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}))
जैसा कि ऊपर बताया गया है, Flask खुद राउटिंग करता है. हैंडलर क्लास के बजाय, फ़ंक्शन लिखे जाते हैं और उन्हें उस रूट से सजाया जाता है जिसके लिए उन्हें कॉल किया जाना चाहिए. उपयोगकर्ता, डेकोरेटर कॉल में मैनेज किए गए एचटीटीपी तरीकों के बारे में बता सकते हैं. जैसे, @app.route('/app/', methods=['GET', 'POST']). डिफ़ॉल्ट रूप से सिर्फ़ GET (और HEAD) उपलब्ध होता है. इसलिए, इसे बंद किया जा सकता है.
Flask पर माइग्रेट करते समय, MainHandler क्लास और उसके get() तरीके को, Flask के इस राउटिंग फ़ंक्शन से बदलें:
- AFTER:
@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 टेंप्लेट फ़ाइल उसी फ़ोल्डर में होती है जिसमें ऐप्लिकेशन फ़ाइलें होती हैं. Flask को 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 जैसे कॉल करने लायक फ़ंक्शन को बिना पैरंटheses ( ) के बिना इस्तेमाल करते हैं. Jinja2 को इनके लिए साफ़ तौर पर पैरंटheses की ज़रूरत होती है. यह बदलाव मामूली लग सकता है, लेकिन Jinja टेंप्लेट ज़्यादा शक्तिशाली होते हैं. ऐसा इसलिए, क्योंकि कॉल में आर्ग्युमेंट पास किए जा सकते हैं.
Django में, आपको "टेंप्लेट टैग" बनाना होगा या फ़िल्टर लिखना होगा. इस जानकारी के साथ, index.html को अपडेट करें. इसके लिए, visit.timestamp.ctime कॉल में पैरंटheses का एक जोड़ा जोड़ें:
- BEFORE:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
- AFTER:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
सिर्फ़ यही बदलाव करना ज़रूरी है. माइग्रेशन के बाकी सभी कोडलैब के लिए, index.html में कोई और बदलाव करने की ज़रूरत नहीं है.
7. खास जानकारी/सफ़ाई
ऐप्लिकेशन डिप्लॉय करना
इस ट्यूटोरियल में दिए गए सभी बदलाव करने के बाद, आपके ऐप्लिकेशन फ़ोल्डर में मौजूद फ़ाइलें, Module 1 repo folder में मौजूद फ़ाइल से मिलती-जुलती होनी चाहिए. अब डिप्लॉय करें और देखें कि आपका Module 1 Flask ऐप्लिकेशन, Module 0 webapp2 वर्शन की तरह ही काम कर रहा है.
gcloud app deploy कमांड का इस्तेमाल करें. हमने इसका इस्तेमाल, ओरिजनल मॉड्यूल 0 कोड को डिप्लॉय करते समय किया था. PROJECT_ID.appspot.com पर जाकर ऐप्लिकेशन को ऐक्सेस करना. इसके लिए, वेब ब्राउज़र या curl या wget कमांड का इस्तेमाल करें, ताकि यह पुष्टि की जा सके कि ऐप्लिकेशन उम्मीद के मुताबिक काम कर रहा है.
अगर आपको सर्वर से जुड़ी कोई गड़बड़ी मिलती है, तो आम तौर पर इसका मतलब है कि आपके Python कोड में टाइपिंग से जुड़ी कोई गड़बड़ी है. इस समस्या की जांच करने के लिए, अपने ऐप्लिकेशन लॉग देखें. साथ ही, अपनी फ़ाइलों की तुलना, मॉड्यूल 1 की रेपो (लिंक ऊपर दिया गया है) में मौजूद फ़ाइलों से करें.
ज़रूरी नहीं: साफ़ करना
जब तक आप माइग्रेशन के अगले कोडलैब पर जाने के लिए तैयार नहीं हो जाते, तब तक बिलिंग से बचने के लिए क्या किया जा सकता है? मौजूदा डेवलपर के तौर पर, आपको App Engine की कीमत से जुड़ी जानकारी के बारे में पहले से ही पता होगा.
ज़रूरी नहीं: ऐप्लिकेशन बंद करना
अगर आपको अभी अगले ट्यूटोरियल पर नहीं जाना है, तो शुल्क से बचने के लिए अपने ऐप्लिकेशन को बंद करें. जब आपको अगले कोडलैब पर जाना हो, तब इसे फिर से चालू किया जा सकता है. जब आपका ऐप्लिकेशन बंद होता है, तब उसे कोई ट्रैफ़िक नहीं मिलता. इसलिए, आपसे कोई शुल्क नहीं लिया जाता. हालांकि, अगर मुफ़्त कोटे से ज़्यादा Datastore का इस्तेमाल किया जाता है, तो आपसे शुल्क लिया जा सकता है. इसलिए, इतना डेटा मिटाएं कि वह सीमा के अंदर आ जाए.
दूसरी ओर, अगर आपको माइग्रेशन जारी नहीं रखना है और आपको सब कुछ पूरी तरह से मिटाना है, तो अपना प्रोजेक्ट बंद करें.
अगले चरण
माइग्रेशन के दो मॉड्यूल हैं. ये मॉड्यूल, पूरे किए गए मॉड्यूल 1 के कोड, मॉड्यूल 2, और 7 से शुरू होते हैं:
- मॉड्यूल 2 (अगर Datastore का इस्तेमाल किया जाता है, तो यह ज़रूरी है)
- App Engine
ndbसे Cloud NDB पर माइग्रेट करना - Cloud NDB पर स्विच करने के बाद, कई अन्य विकल्प उपलब्ध हो जाते हैं
- Cloud Run पर चलाने के लिए, अपने ऐप्लिकेशन को कंटेनर में बदलना
- अपने ऐप्लिकेशन को Cloud Datastore क्लाइंट लाइब्रेरी पर माइग्रेट करना
- Firebase की सुविधाओं का ऐक्सेस पाने के लिए, अपने ऐप्लिकेशन को Cloud Firestore पर माइग्रेट करना
- App Engine
- मॉड्यूल 7 (अगर आपको [push] टास्क कतारों का इस्तेमाल करना है, तो यह ज़रूरी है)
- App Engine (पुश)
taskqueueके इस्तेमाल की जानकारी जोड़ना - यह मॉड्यूल 1 के ऐप्लिकेशन को मॉड्यूल 8 में Cloud Tasks पर माइग्रेट करने के लिए तैयार करता है
- App Engine (पुश)
8. अन्य संसाधन
App Engine माइग्रेशन मॉड्यूल कोडलैब से जुड़ी समस्याएं/सुझाव/राय
अगर आपको इस कोडलैब में कोई समस्या मिलती है, तो कृपया शिकायत दर्ज करने से पहले अपनी समस्या खोजें. नई समस्याएं खोजने और बनाने के लिए लिंक:
माइग्रेशन के लिए उपलब्ध संसाधन
मॉड्यूल 0 (START) और मॉड्यूल 1 (FINISH) के लिए, रेपो फ़ोल्डर के लिंक यहां दी गई टेबल में देखे जा सकते हैं. इन्हें App Engine के सभी माइग्रेशन के लिए उपलब्ध रिपॉजिटरी से भी ऐक्सेस किया जा सकता है. इसे क्लोन किया जा सकता है या इसकी ZIP फ़ाइल डाउनलोड की जा सकती है.
कोडलैब | Python 2 | Python 3 |
मॉड्यूल 0 | (लागू नहीं) | |
Module 1 | (लागू नहीं) |
App Engine के संसाधन
इस माइग्रेशन के बारे में ज़्यादा जानकारी के लिए, यहां दिए गए संसाधन देखें:
- Python के माइक्रो वेब फ़्रेमवर्क
- (OLD) Python 2.5 से 2.7 और
webappसेwebapp2पर माइग्रेट करना - Python 3 और GAE के अगली जनरेशन के रनटाइम पर माइग्रेट करना
- सामान्य