मॉड्यूल 3: Google Cloud NDB से Cloud Datastore पर माइग्रेट करना

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

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

इस ट्यूटोरियल में डेवलपर को क्लाइंट लाइब्रेरी के तौर पर, Cloud NDB से Cloud Datastore में माइग्रेट करने का तरीका बताया गया है, ताकि वे Datastore सेवा से संपर्क कर सकें. जो डेवलपर एनडीबी को पसंद करते हैं वे इसके साथ बने रह सकते हैं, क्योंकि यह Python 3 के साथ काम करता है. इसलिए, यह माइग्रेशन ज़रूरी नहीं है. यह माइग्रेशन सिर्फ़ उन लोगों के लिए है जो पहले से Cloud Datastore का इस्तेमाल कर रहे अन्य ऐप्लिकेशन के साथ, एक जैसा कोडबेस और शेयर की गई लाइब्रेरी बनाना चाहते हैं. इसके बारे में "बैकग्राउंड" में बताया गया है सेक्शन में जाएं.

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

  • Cloud NDB का इस्तेमाल करें (अगर आपको इसके बारे में पता नहीं है)
  • Cloud NDB से Cloud Datastore पर माइग्रेट करना
  • इसके बाद, अपने ऐप्लिकेशन को Python 3 पर माइग्रेट करें

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

  • एक Google Cloud Platform प्रोजेक्ट, जिसमें GCP का बिलिंग खाता चालू है
  • Python के बुनियादी हुनर
  • Linux के बुनियादी निर्देशों के बारे में काम करने की जानकारी
  • App Engine ऐप्लिकेशन डेवलप करने और डिप्लॉय करने की बुनियादी जानकारी
  • चालू मॉड्यूल 2 App Engine 2.x या 3.x ऐप्लिकेशन.

सर्वे

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

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

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

हालांकि, Cloud NDB लंबे समय के ऐप्लिकेशन इंजन डेवलपर के लिए एक बेहतरीन Datastore समाधान है. इससे Python 3 पर ट्रांज़िशन करने में मदद मिलती है. हालांकि, App Engine डेवलपर भी Datastore को सिर्फ़ इसी तरीके से ऐक्सेस नहीं कर सकते. जब App Engine के Datastore को 2013 में अपना प्रॉडक्ट मिला, तब Google Cloud Datastore, एक नई क्लाइंट लाइब्रेरी बनाई गई. इससे सभी उपयोगकर्ता, Datastore का इस्तेमाल कर सकते थे.

Python 3 App Engine और गैर-App Engine डेवलपर को Cloud Datastore का इस्तेमाल करने के लिए कहा जाता है, न कि Cloud NDB का. Python 2 App Engine के डेवलपर को सलाह दी जाती है कि वे ndb से Cloud NDB और पोर्ट को Python 3 पर माइग्रेट करें. हालांकि, वे आगे से Cloud Datastore पर भी माइग्रेट कर सकते हैं. यह खास तौर पर उन डेवलपर के लिए सही फ़ैसला है जिनके पास Cloud Datastore का इस्तेमाल करके पहले से ही कोड है, जैसा कि अभी बताया गया है. साथ ही, जो अपने सभी ऐप्लिकेशन के लिए शेयर की जाने वाली लाइब्रेरी बनाना चाहते हैं. कोड का एक जैसा होना सबसे सही तरीका है. साथ ही, इन दोनों तरीकों से रखरखाव की लागत कम हो जाती है, जैसा कि यहां खास जानकारी दी गई है:

Cloud NDB से Cloud Datastore में माइग्रेट करना

  • इससे डेवलपर, Datastore को ऐक्सेस करने के लिए एक ही कोड बेस पर फ़ोकस कर सकते हैं
  • Cloud NDB और दूसरे Cloud Datastore का इस्तेमाल करके, कुछ कोड में कोई बदलाव नहीं किया जाता
  • कोड बेस में ज़्यादा समानता और कोड को दोबारा इस्तेमाल करने की बेहतर सुविधा देता है
  • सामान्य/शेयर लाइब्रेरी के उपयोग को सक्षम करता है, जो कुल रखरखाव लागत को कम करता है

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

  1. सेटअप/प्रीवर्क
  2. Cloud NDB को Cloud Datastore क्लाइंट लाइब्रेरी से बदलें
  3. ऐप्लिकेशन अपडेट करें

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

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

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

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

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

सबसे ज़रूरी शर्तों में से एक यह है कि आपके पास मॉड्यूल 2 का सैंपल ऐप्लिकेशन हो. अगर आपने यह ट्यूटोरियल पूरा कर लिया है, तो अपने समाधान का इस्तेमाल करें. इस प्रोसेस को अभी पूरा करें (ऊपर दिया गया लिंक) या अगर आपको इसे छोड़ना है, तो मॉड्यूल 2 रेपो को कॉपी करें (लिंक नीचे दिया गया है).

चाहे आप अपने या हमारे किसी अन्य कोड का इस्तेमाल करें, हम मॉड्यूल 2 कोड का इस्तेमाल करके शुरुआत करेंगे. यह मॉड्यूल 3 कोडलैब आपको हर चरण पर ले जाता है. इसके पूरा होने पर, यह FINISH पॉइंट पर कोड की तरह दिखना चाहिए. इस ट्यूटोरियल के Python 2 और 3 वर्शन मौजूद हैं. इसलिए, यहां दिए गए सही कोड रेपो की मदद लें.

Python 2

Python 2 मॉड्यूल 2 की शुरुआती फ़ाइलों (आपकी या हमारी) की डायरेक्ट्री कुछ इस तरह दिखेगी:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

अगर आपने मॉड्यूल 2 ट्यूटोरियल पूरा कर लिया है, तो आपके पास फ़्लास्क और उसकी डिपेंडेंसी के साथ एक lib फ़ोल्डर भी होगा. अगर आपके पास कोई lib फ़ोल्डर नहीं है, तो इसे pip install -t lib -r requirements.txt निर्देश का इस्तेमाल करके बनाएं. इससे हम अगले चरण में इस बेसलाइन ऐप्लिकेशन को डिप्लॉय कर सकेंगे. अगर आपने Python 2 और 3, दोनों वर्शन इंस्टॉल किए हैं, तो हमारा सुझाव है कि आप pip के बजाय pip2 का इस्तेमाल करें. इससे, Python 3 के साथ किसी तरह की भ्रम पैदा नहीं होती.

Python 3

Python 3 मॉड्यूल 2 की शुरुआती फ़ाइलों (आपकी या हमारी) की डायरेक्ट्री कुछ इस तरह दिखेगी:

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

Python 3 के लिए, न तो lib का इस्तेमाल किया जाता है और न ही appengine_config.py का.

3. मॉड्यूल 2 ऐप्लिकेशन को फिर से डिप्लॉय करें

कार्रवाई से पहले, इन चरणों को पूरा करें:

  1. gcloud कमांड-लाइन टूल (अगर ज़रूरी हो) का इस्तेमाल करके खुद को फिर से जानें
  2. (अगर ज़रूरी हो, तो) मॉड्यूल 1 कोड को App Engine पर फिर से डिप्लॉय करें

इन चरणों को पूरा करने और इसके काम होने की पुष्टि करने के बाद, हम इस ट्यूटोरियल में कॉन्फ़िगरेशन फ़ाइलों के बारे में बताएंगे.

4. Cloud NDB को Cloud Datastore क्लाइंट लाइब्रेरी से बदलें

कॉन्फ़िगरेशन में सिर्फ़ एक छोटा सा बदलाव किया गया है. आपकी requirements.txt फ़ाइल में पैकेज को स्वैप किया गया है.

1. requirements.txt को अपडेट करें

मॉड्यूल 2 पूरा करने पर, आपकी requirements.txt फ़ाइल कुछ ऐसी दिखी:

  • पहले (Python 2 और 3):
Flask==1.1.2
google-cloud-ndb==1.7.1

Cloud Datastore लाइब्रेरी (google-cloud-ndb) को Cloud Datastore लाइब्रेरी (google-cloud-datastore) के सबसे नए वर्शन से बदलकर, requirements.txt को अपडेट करें. ऐसा करने से, फ़्लास्क की एंट्री में कोई बदलाव नहीं होगा. इस बात का ध्यान रखें कि Python 2 के साथ काम करने वाले Cloud Datastore का आखिरी वर्शन 1.15.3 है:

  • after (Python 2):
Flask==1.1.2
google-cloud-datastore==1.15.3
  • उसके बाद (Python 3):
Flask==1.1.2
google-cloud-datastore==2.1.0

ध्यान रखें कि इस ट्यूटोरियल के मुकाबले, डेटा स्टोर करने की जगह को नियमित तौर पर मैनेज किया जाता है. इसलिए, हो सकता है कि requirements.txt फ़ाइल में नए वर्शन दिखें. हमारा सुझाव है कि आप हर लाइब्रेरी के सबसे नए वर्शन का इस्तेमाल करें. अगर वे काम नहीं करते हैं, तो किसी पुरानी रिलीज़ पर रोल बैक किया जा सकता है. ऊपर दिए गए वर्शन नंबर इस कोडलैब को पिछली बार अपडेट किए जाने के बाद के हैं.

2. अन्य कॉन्फ़िगरेशन फ़ाइलें

अन्य कॉन्फ़िगरेशन फ़ाइलों, app.yaml और appengine_config.py में पिछले माइग्रेशन चरण से कोई बदलाव नहीं होना चाहिए:

  • app.yaml को (अब भी) तीसरे पक्ष के बंडल किए गए पैकेज grpcio और setuptools का रेफ़रंस देना चाहिए.
  • appengine_config.py को (अब भी) lib में तीसरे पक्ष के संसाधनों से pkg_resources और google.appengine.ext.vendor पॉइंट हासिल करने होंगे.

अब ऐप्लिकेशन फ़ाइलों पर जाएं.

5. ऐप्लिकेशन फ़ाइलें अपडेट करें

template/index.html में कोई बदलाव नहीं किया गया है. हालांकि, main.py के लिए कुछ अपडेट हैं.

1. आयात

इंपोर्ट सेक्शन का शुरुआती कोड इस तरह दिखना चाहिए:

  • पहले:
from flask import Flask, render_template, request
from google.cloud import ndb

Cloud Datastore के लिए google.cloud.ndb इंपोर्ट को एक इंपोर्ट से बदलें: google.cloud.datastore. Datastore क्लाइंट लाइब्रेरी, किसी इकाई में टाइमस्टैंप फ़ील्ड के अपने-आप बनने की सुविधा के साथ काम नहीं करती है. इसलिए, मैन्युअल तरीके से टाइमस्टैंप फ़ील्ड बनाने के लिए, स्टैंडर्ड लाइब्रेरी datetime मॉड्यूल को भी इंपोर्ट करें. आम तौर पर, स्टैंडर्ड लाइब्रेरी इंपोर्ट, तीसरे पक्ष के पैकेज से ज़्यादा इंपोर्ट किए जाते हैं. ये बदलाव करने के बाद, यह ऐसा दिखना चाहिए:

  • इसके बाद:
from datetime import datetime
from flask import Flask, render_template, request
from google.cloud import datastore

2. प्रोसेस शुरू करना और डेटा मॉडल

फ़्लास्क को शुरू करने के बाद, मॉड्यूल 2 सैंपल ऐप्लिकेशन एक एनडीबी डेटा मॉडल क्लास बनाता है और इसके फ़ील्ड इस तरह से सेट होते हैं:

  • पहले:
app = Flask(__name__)
ds_client = ndb.Client()

class Visit(ndb.Model):
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

Cloud Datastore लाइब्रेरी में ऐसी कोई क्लास नहीं है. इसलिए, Visit क्लास का एलान मिटाएं. Datastore से बात करने के लिए, आपको अब भी किसी क्लाइंट की ज़रूरत होगी. इसलिए, ndb.Client() को बदलकर datastore.Client() करें. Datastore लाइब्रेरी अब ज़्यादा "सुविधाजनक" है इससे आपको "पहले से एलान" किए बिना इकाइयां बनाने की अनुमति मिलती है एनडीबी की तरह हो सकता है. इस अपडेट के बाद, main.py का यह हिस्सा ऐसा दिखना चाहिए:

  • इसके बाद:
app = Flask(__name__)
ds_client = datastore.Client()

3. डेटास्टोर का ऐक्सेस

Cloud Datastore पर माइग्रेट करने के लिए, उपयोगकर्ता के लेवल पर, Datastore एलिमेंट को बनाने, सेव करने, और क्वेरी करने के तरीके में बदलाव करना ज़रूरी है. आपके ऐप्लिकेशन के लिए, इस माइग्रेशन में आने वाली मुश्किल इस बात पर निर्भर करती है कि आपका डेटास्टोर कोड कितना जटिल है. सैंपल के तौर पर उपलब्ध हमारे ऐप्लिकेशन में, हमने अपडेट को जितना हो सके उतना आसान बनाने की कोशिश की. हमारा शुरुआती कोड यहां दिया गया है:

  • पहले:
def store_visit(remote_addr, user_agent):
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    with ds_client.context():
        return (v.to_dict() for v in Visit.query().order(
                -Visit.timestamp).fetch_page(limit)[0])

Cloud Datastore के साथ, एक सामान्य इकाई बनाएं और अपनी इकाई में ग्रुप किए गए ऑब्जेक्ट की पहचान "कुंजी" से करें. की-वैल्यू पेयर के JSON ऑब्जेक्ट (Python dict) की मदद से डेटा रिकॉर्ड बनाएं. इसके बाद, उसे सही put() के साथ Datastore में लिखें. Datastore के साथ क्वेरी करना पहले जैसा ही है, लेकिन ज़्यादा आसान है. यहां देखा जा सकता है कि एक जैसा डेटास्टोर कोड किस तरह अलग है:

  • इसके बाद:
def store_visit(remote_addr, user_agent):
    entity = datastore.Entity(key=ds_client.key('Visit'))
    entity.update({
        'timestamp': datetime.now(),
        'visitor': '{}: {}'.format(remote_addr, user_agent),
    })
    ds_client.put(entity)

def fetch_visits(limit):
    query = ds_client.query(kind='Visit')
    query.order = ['-timestamp']
    return query.fetch(limit=limit)

store_visit() और fetch_visits() के लिए ऊपर बताए गए तरीके के हिसाब से, फ़ंक्शन के मुख्य हिस्से अपडेट करें. इसके लिए, उनके हस्ताक्षर पिछले वर्शन की तरह ही रखें. मुख्य हैंडलर root() में कोई बदलाव नहीं किया गया है. इन बदलावों को पूरा करने के बाद, अब आपका ऐप्लिकेशन Cloud Datastore के इस्तेमाल के लिए तैयार हो जाएगा और उसकी जांच की जा सकेगी.

6. खास जानकारी/क्लीनअप

ऐप्लिकेशन डिप्लॉय करें

gcloud app deploy के साथ अपने ऐप्लिकेशन को फिर से डिप्लॉय करें और पक्का करें कि ऐप्लिकेशन काम कर रहा हो. अब आपका कोड, मॉड्यूल 3 रेपो फ़ोल्डर में मौजूद कोड से मेल खाना चाहिए:

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

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

मॉड्यूल 3 कोडलैब (कोड बनाना सीखना) पूरा करने के लिए बधाई. अब आपको पता है कि Datastore को ऐक्सेस करने के लिए, Cloud NDB और Cloud Datastore क्लाइंट लाइब्रेरी, दोनों का इस्तेमाल किया जा सकता है. बाद वाले मॉडल पर माइग्रेट करने पर, आपको शेयर की गई लाइब्रेरी, कॉमन कोड, और कोड का एक जैसा इस्तेमाल करने की सुविधा मिलती है. साथ ही, इनके रखरखाव का खर्च भी कम होता है.

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

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

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

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

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

अगले चरण

यहां से, इन अगले माइग्रेशन मॉड्यूल को बेझिझक एक्सप्लोर करें:

  • मॉड्यूल 3 बोनस: Python 3 और अगली-पीढ़ी की टेक्नोलॉजी के App Engine रनटाइम में पोर्ट करने का तरीका जानने के लिए बोनस सेक्शन पर जाएं.
  • मॉड्यूल 7: App Engine पुश टास्क की सूचियां (अगर आप [push] टास्क की सूची का इस्तेमाल करते हैं, तो यह ज़रूरी है)
    • मॉड्यूल 1 ऐप्लिकेशन में App Engine taskqueue पुश टास्क जोड़ता है
    • उपयोगकर्ताओं को मॉड्यूल 8 में, Cloud Tasks पर माइग्रेट करने के लिए तैयार करता है
  • मॉड्यूल 4: Docker के साथ क्लाउड रन पर माइग्रेट करें
    • Docker के साथ Cloud Run पर चलाने के लिए, अपने ऐप्लिकेशन को कंटेनर में रखें
    • आपको Python 2 पर बने रहने देता है
  • मॉड्यूल 5: Cloud Buildpack के साथ Cloud Run पर माइग्रेट करना
    • Cloud Buildpack की मदद से, अपने ऐप्लिकेशन को Cloud Run पर चलाने के लिए कंटेनर बनाएं
    • Docker, कंटेनर या Dockerfile के बारे में जानने की ज़रूरत नहीं है
    • यह ज़रूरी है कि आपने अपने ऐप्लिकेशन को पहले ही Python 3 पर माइग्रेट कर लिया हो
  • मॉड्यूल 6: Cloud Firestore
      पर माइग्रेट करें
    • Firebase की सुविधाएं ऐक्सेस करने के लिए, Cloud Firestore पर माइग्रेट करें
    • Cloud Firestore Python 2 के साथ काम करता है, लेकिन यह कोडलैब सिर्फ़ Python 3 में उपलब्ध है.

7. BONUS: Python 3 पर माइग्रेट करना

App Engine के नए रनटाइम और सुविधाओं को ऐक्सेस करने के लिए, हमारा सुझाव है कि आप Python 3 पर माइग्रेट करें. सैंपल के तौर पर उपलब्ध हमारे ऐप्लिकेशन में, सिर्फ़ Datastore ही पहले से मौजूद सेवा का इस्तेमाल करता था. हम ndb से Cloud NDB पर माइग्रेट कर चुके हैं. इसलिए, अब हम App Engine के Python 3 रनटाइम में पोर्ट कर सकते हैं.

खास जानकारी

Python 3 में पोर्ट करना Google Cloud ट्यूटोरियल के दायरे में नहीं आता. हालांकि, कोडलैब के इस हिस्से से डेवलपर को यह जानने में मदद मिलती है कि Python 3 App Engine का रनटाइम किस तरह अलग होता है. अगली पीढ़ी के रनटाइम की एक बेहतरीन सुविधा, तीसरे पक्ष के पैकेज को आसानी से ऐक्सेस करने में मदद करती है: app.yaml में पहले से मौजूद पैकेज के बारे में बताने की ज़रूरत नहीं है और न ही बिना पहले से मौजूद लाइब्रेरी को कॉपी या अपलोड करने की ज़रूरत है; वे requirements.txt में शामिल होने से साफ़ तौर पर इंस्टॉल हो जाते हैं.

हमारा सैंपल बहुत बुनियादी है और Cloud Datastore, Python 2-3 के साथ काम करता है. इसलिए, किसी भी ऐप्लिकेशन कोड को साफ़ तौर पर 3.x पर पोर्ट करने की ज़रूरत नहीं है: यह ऐप्लिकेशन, 2.x और 3.x पर बिना किसी बदलाव के चलता है. इसका मतलब है कि इस मामले में कॉन्फ़िगरेशन में सिर्फ़ ज़रूरी बदलाव किए गए हैं:

  1. Python 3 का रेफ़रंस देने के लिए, app.yaml को आसान बनाएं और तीसरे पक्ष की बंडल की गई लाइब्रेरी के रेफ़रंस हटाएं.
  2. appengine_config.py और lib फ़ोल्डर को मिटा दें, क्योंकि अब इनकी ज़रूरत नहीं है.

main.py और templates/index.html ऐप्लिकेशन फ़ाइलों में कोई बदलाव नहीं हुआ है.

requirements.txt को अपडेट करें

Python 2 के साथ काम करने वाले Cloud Datastore का आखिरी वर्शन 1.15.3 है. requirements.txt को Python 3 के सबसे नए वर्शन के साथ अपडेट करें (यह अब तक नया हो सकता है). जब यह ट्यूटोरियल लिखा गया था, तो नया वर्शन 2.1.0 था, इसलिए उस लाइन को इस तरह दिखाने के लिए उसमें बदलाव करें (या जो भी नया वर्शन हो), वह लाइन में बदलाव करें:

google-cloud-datastore==2.1.0

app.yaml को आसान बनाएं

पहले:

सैंपल के तौर पर इस्तेमाल होने वाले इस ऐप्लिकेशन में, सिर्फ़ app.yaml को काफ़ी छोटा करना ही अहम है. आपको याद दिला दें कि मॉड्यूल 3 के आखिर में app.yaml में हमने यह जानकारी दी थी:

runtime: python27
threadsafe: yes
api_version: 1

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

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

इसके बाद:

Python 3 में, threadsafe, api_version, और libraries डायरेक्टिव सभी काम नहीं करते; सभी ऐप्लिकेशन को थ्रेडसुरक्षित मान लिया गया है और Python 3 में api_version का इस्तेमाल नहीं किया जाता. App Engine की सेवाओं पर अब पहले से मौजूद, तीसरे पक्ष के पैकेज पहले से इंस्टॉल नहीं हैं. इसलिए, libraries को भी बंद कर दिया गया है. इन बदलावों के बारे में ज़्यादा जानकारी के लिए, app.yaml में हुए बदलावों से जुड़े दस्तावेज़ देखें. इसलिए, आपको app.yaml से इन तीनों को मिटा देना चाहिए और काम करने वाले Python 3 वर्शन पर अपडेट करना चाहिए (नीचे देखें).

ज़रूरी नहीं: handlers डायरेक्टिव का इस्तेमाल करना

इसके अलावा, App Engine ऐप्लिकेशन पर ट्रैफ़िक भेजने वाले handlers डायरेक्टिव को भी हटा दिया गया है. अगली पीढ़ी के रनटाइम के लिए ज़रूरी है कि वेब फ़्रेमवर्क, ऐप्लिकेशन रूटिंग को मैनेज करें. इसलिए, सभी "हैंडलर स्क्रिप्ट" इसे "auto" में बदला जाना चाहिए. ऊपर बताए गए बदलावों को जोड़ने पर, आप इस app.yaml पर पहुंचते हैं:

runtime: python38

handlers:
- url: /.*
  script: auto

script: auto के बारे में ज़्यादा जानने के लिए, app.yaml रेफ़रंस पेज पर जाएं.

handlers डायरेक्टिव हटाया जा रहा है

handlers अब काम नहीं करता. इसलिए, आपके पास एक लाइन app.yaml छोड़कर, पूरे सेक्शन को हटाने का विकल्प भी है:

runtime: python38

डिफ़ॉल्ट रूप से, इससे Gunicorn WSGI वेब सर्वर लॉन्च हो जाएगा, जो सभी ऐप्लिकेशन के लिए उपलब्ध रहेगा. अगर आपको gunicorn के बारे में जानकारी है, तो इस निर्देश को बेयरबोन app.yaml के साथ डिफ़ॉल्ट रूप से शुरू किए जाने पर लागू किया जाता है:

gunicorn main:app --workers 2 -c /config/gunicorn.py

ज़रूरी नहीं: entrypoint डायरेक्टिव का इस्तेमाल करना

हालांकि, अगर आपके ऐप्लिकेशन को एक खास स्टार्ट-अप निर्देश की ज़रूरत है, तो उसे एक entrypoint निर्देश के साथ तय किया जा सकता है, जिससे एक app.yaml मिलता है जो ऐसा दिखता है:

runtime: python38
entrypoint: python main.py

यह उदाहरण खास तौर पर gunicorn के बजाय फ़्लास्क डेवलपमेंट सर्वर का इस्तेमाल करने का अनुरोध करता है. डेवलपमेंट सर्वर को शुरू करने वाला कोड भी आपके ऐप्लिकेशन में जोड़ा जाना चाहिए. इससे पोर्ट 8080 पर 0.0.0.0 इंटरफ़ेस पर लॉन्च किया जा सकता है. इसके लिए, इस छोटे से सेक्शन को main.py में सबसे नीचे जोड़ना होगा:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

entrypoint के बारे में ज़्यादा जानने के लिए, app.yaml रेफ़रंस पेज पर जाएं. ज़्यादा उदाहरण और सबसे सही तरीके, App Engine स्टैंडर्ड एनवायरमेंट स्टार्टअप दस्तावेज़ों के साथ-साथ App Engine के आसान एनवायरमेंट स्टार्टअप दस्तावेज़ों में मिल सकते हैं.

appengine_config.py और lib मिटाएं

appengine_config.py फ़ाइल और lib फ़ोल्डर को मिटाएं. Python 3 पर माइग्रेट करने के दौरान, App Engine, requirements.txt में दिए गए पैकेज हासिल और इंस्टॉल करता है.

appengine_config.py कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल तीसरे पक्ष की लाइब्रेरी/पैकेज की पहचान करने के लिए किया जाता है. भले ही, आपने उन्हें खुद कॉपी किया हो या App Engine सर्वर (पहले से मौजूद) पर पहले से मौजूद लाइब्रेरी का इस्तेमाल किया हो. Python 3 में जाने पर, इन बड़े बदलावों की खास जानकारी नीचे दी गई है:

  1. कॉपी की गई तीसरे पक्ष की लाइब्रेरी का कोई बंडलिंग नहीं (requirements.txt में दी गई सूची)
  2. lib फ़ोल्डर में कोई pip install नहीं है. इसका मतलब है कि lib फ़ोल्डर में कोई पीरियड नहीं है
  3. app.yaml में तीसरे पक्ष की कोई लाइब्रेरी पहले से मौजूद नहीं है
  4. ऐप्लिकेशन को तीसरे पक्ष की लाइब्रेरी से रेफ़रंस लेने की ज़रूरत नहीं है. इसलिए, appengine_config.py फ़ाइल का इस्तेमाल नहीं किया जाता

requirements.txt में तीसरे पक्ष की सभी ज़रूरी लाइब्रेरी की सूची बनाना ज़रूरी है.

ऐप्लिकेशन डिप्लॉय करें

अपने ऐप्लिकेशन को फिर से डिप्लॉय करें, ताकि यह पक्का किया जा सके कि वह सही तरीके से काम करे. यह पुष्टि भी की जा सकती है कि आपका सलूशन, मॉड्यूल 3 सैंपल Python 3 कोड के कितना करीब है. Python 2 के साथ अंतर को समझने के लिए, इसके Python 2 वर्शन से कोड की तुलना करें.

मॉड्यूल 3 में बोनस स्टेप पूरा करने पर बधाई! Python 3 रनटाइम के लिए कॉन्फ़िगरेशन फ़ाइलें तैयार करने से जुड़ा दस्तावेज़ देखें. आखिर में, अगले चरणों और क्लीनअप के बारे में जानने के लिए, ऊपर दी गई खास जानकारी की समीक्षा करें.

आपका ऐप्लिकेशन तैयार किया जा रहा है

जब अपने ऐप्लिकेशन को माइग्रेट करने का समय आए, तब आपको अपने main.py और ऐप्लिकेशन की अन्य फ़ाइलों को 3.x में पोर्ट करना होगा. इसलिए, सबसे सही तरीका यह है कि आप अपने 2.x ऐप्लिकेशन को "फ़ॉरवर्ड करने के साथ काम करने वाला" के तौर पर सेट करें किया जा सकता है.

ऐसा करने में आपकी मदद करने के लिए कई ऑनलाइन संसाधन उपलब्ध हैं, लेकिन कुछ अहम सलाह यहां दी गई है:

  1. पक्का करें कि सभी ऐप्लिकेशन डिपेंडेंसी पूरी तरह से 3.x के साथ काम करती हों
  2. पक्का करें कि आपका ऐप्लिकेशन कम से कम 2.6 (बेहतर होगा) 2.7 पर चलता हो.
  3. पक्का करें कि ऐप्लिकेशन, टेस्ट सुइट में पास हो और कम से कम 80% कवरेज में हो
  4. साथ काम करने वाली लाइब्रेरी का इस्तेमाल करना. जैसे, six, Future, और/या Modernize
  5. 2.x और 3.x के बीच के अंतर के बारे में जानें
  6. किसी भी I/O की वजह से, यूनिकोड बनाम बाइट स्ट्रिंग में गड़बड़ी हो सकती है

सैंपल ऐप्लिकेशन को इन सभी बातों को ध्यान में रखकर डिज़ाइन किया गया है. इसलिए, यह ऐप्लिकेशन 2.x और 3.x पर काम करता है, ताकि हम आपको यह दिखा सकें कि अगली पीढ़ी के प्लैटफ़ॉर्म का इस्तेमाल करने के लिए क्या बदलाव करने की ज़रूरत है.

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

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

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

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

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

Codelab

Python 2

Python 3

मॉड्यूल 2

कोड

कोड

मॉड्यूल 3

कोड

कोड

App Engine के संसाधन

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