Python Flask वेब ऐप्लिकेशन को App Engine फ़्लेक्सिबल एनवायरमेंट में डिप्लॉय करना

खास जानकारी

इस कोडलैब में, Python Flask वेब ऐप्लिकेशन को App Engine फ़्लेक्सिबल एनवायरमेंट में डिप्लॉय करने का तरीका बताया गया है. उदाहरण के तौर पर दिए गए ऐप्लिकेशन में, कोई व्यक्ति किसी दूसरे व्यक्ति के चेहरे की फ़ोटो अपलोड कर सकता है. इससे उसे यह पता चलता है कि फ़ोटो में दिख रहा व्यक्ति कितना खुश है. यह ऐप्लिकेशन, Vision, Storage, और Datastore के लिए Google Cloud API का इस्तेमाल करता है.

App Engine के बारे में जानकारी

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

App Engine ऐप्लिकेशन, आने वाले ट्रैफ़िक के आधार पर अपने-आप स्केल हो जाते हैं. लोड बैलेंसिंग, माइक्रोसेवाएं, अनुमति, SQL और NoSQL डेटाबेस, ट्रैफ़िक स्प्लिटिंग, लॉगिंग, खोज, वर्शनिंग, रोल आउट और रोल बैक, और सुरक्षा स्कैनिंग जैसी सुविधाएं, नेटिव तौर पर काम करती हैं. साथ ही, इन्हें अपनी ज़रूरत के हिसाब से बनाया जा सकता है.

App Engine का फ़्लेक्सिबल एनवायरमेंट, इन सभी प्रोग्रामिंग भाषाओं के साथ काम करता है: C#, Go, Java, Node.js, PHP, Python, और Ruby. App Engine Flexible, आपके ऐप्लिकेशन को Google Compute Engine की वर्चुअल मशीनों पर चल रहे Docker कंटेनर में चलाता है. App Engine का स्टैंडर्ड एनवायरमेंट, Python जैसी कुछ भाषाओं के लिए एक विकल्प है. App Engine Standard, आपके ऐप्लिकेशन को ज़्यादा पाबंदी वाले सैंडबॉक्स एनवायरमेंट में चलाता है. ज़्यादा जानकारी के लिए, App Engine एनवायरमेंट चुनना लेख पढ़ें.

आपको क्या सीखने को मिलेगा

  • App Engine फ़्लेक्सिबल एनवायरमेंट में, सामान्य वेब ऐप्लिकेशन को डिप्लॉय करने का तरीका
  • Vision, Storage, और Datastore के लिए Google Cloud क्लाइंट लाइब्रेरी को ऐक्सेस करने का तरीका
  • अलग-अलग क्लाउड संसाधनों को मैनेज करने के लिए, Google Cloud Console और Google Cloud SDK का इस्तेमाल कैसे करें
  • Cloud Shell का इस्तेमाल करने का तरीका

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

  • Python की जानकारी
  • Vim, Emacs या Nano जैसे स्टैंडर्ड Linux टेक्स्ट एडिटर के बारे में जानकारी होना

प्रोजेक्ट बनाना

अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console (console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं:

प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोडलैब में इसे बाद में PROJECT_ID के तौर पर दिखाया जाएगा.

बिलिंग

इसके बाद, Google Cloud संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग चालू करनी होगी.

इस कोडलैब को पूरा करने में आपको कुछ डॉलर से ज़्यादा खर्च नहीं करने पड़ेंगे. हालांकि, अगर ज़्यादा संसाधनों का इस्तेमाल किया जाता है या उन्हें चालू रखा जाता है, तो यह खर्च बढ़ सकता है.

Google Cloud Platform के नए उपयोगकर्ता, 300 डॉलर के क्रेडिट के साथ मुफ़्त में आज़माने की सुविधा पा सकते हैं.

Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है. Debian पर आधारित इस वर्चुअल मशीन में, आपको ज़रूरी सभी डेवलपमेंट टूल (gcloud, python, virtualenv, pip वगैरह) मिलते हैं. इसमें 5 जीबी की होम डायरेक्ट्री होती है और यह Google Cloud पर चलती है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इसका मतलब है कि इस कोडलैब के लिए, आपको सिर्फ़ एक ब्राउज़र की ज़रूरत होगी. यह Chromebook पर भी काम करता है.

Google Cloud Shell को चालू करने के लिए, डेवलपर कंसोल में सबसे ऊपर दाईं ओर मौजूद बटन पर क्लिक करें. इसे चालू होने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा:

क्लाउड शेल से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके PROJECT_ID पर पहले ही सेट कर दिया गया है:

gcloud auth list
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
[core]
Project = <PROJECT_ID>

अगर किसी वजह से प्रोजेक्ट सेट नहीं किया गया है, तो यह कमांड दें:

gcloud config set project <PROJECT_ID>

क्या आपको अपना PROJECT_ID चाहिए? देखें कि आपने सेटअप के दौरान किस प्रोजेक्ट आईडी का इस्तेमाल किया था. इसके अलावा, इसे कंसोल डैशबोर्ड में भी देखा जा सकता है:

Github रिपॉज़िटरी को क्लोन करने के लिए, कमांड-लाइन पर Cloud Shell में यह कमांड चलाएं:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

डायरेक्ट्री को python-docs-samples/codelabs/flex_and_vision में बदलें:

cd python-docs-samples/codelabs/flex_and_vision

Vision, Storage, और Datastore API का इस्तेमाल शुरू करने से पहले, आपको इन एपीआई को चालू करना होगा. इसके लिए, आपको ये कमांड इस्तेमाल करनी होंगी:

gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com

Vision, Storage, और Datastore API से अनुरोध करने के लिए, आपको सेवा खाते के क्रेडेंशियल की ज़रूरत होगी. gcloud टूल का इस्तेमाल करके, आपके प्रोजेक्ट के सेवा खाते के क्रेडेंशियल जनरेट किए जा सकते हैं.

अपने PROJECT_ID के लिए एनवायरमेंट वैरिएबल सेट करें. इसके लिए, [YOUR_PROJECT_ID] की जगह अपना प्रोजेक्ट आईडी डालें:

export PROJECT_ID=[YOUR_PROJECT_ID]

स्थानीय तौर पर टेस्टिंग करते समय, Google Cloud API को ऐक्सेस करने के लिए सेवा खाता बनाएं:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

अपने नए बनाए गए सेवा खाते को ज़रूरी अनुमतियां दें:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

सेवा खाता बनाने के बाद, सेवा खाता कुंजी बनाएं:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

इस निर्देश से, सेवा खाते की एक कुंजी जनरेट होती है. यह कुंजी, आपकी होम डायरेक्ट्री में key.json नाम की JSON फ़ाइल में सेव होती है.

जनरेट की गई कुंजी के पूरे पाथ का इस्तेमाल करके, Cloud Shell में अपने सेवा खाते की कुंजी के लिए एनवायरमेंट वैरिएबल सेट करें:

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Vision API की पुष्टि करने के बारे में ज़्यादा जानें.

वर्चुअल एनवायरमेंट शुरू करना और डिपेंडेंसी इंस्टॉल करना

virtualenv की मदद से, env नाम का एक अलग Python 3 एनवायरमेंट बनाएं:

virtualenv -p python3 env

env नाम का नया virtualenv डालें:

source env/bin/activate

requirements.txt फ़ाइल से अपने प्रोजेक्ट के लिए डिपेंडेंसी इंस्टॉल करने के लिए, pip का इस्तेमाल करें:

pip install -r requirements.txt

requirements.txt फ़ाइल में, पैकेज की उन डिपेंडेंसी की सूची होती है जिनकी ज़रूरत आपको अपने प्रोजेक्ट के लिए होती है. ऊपर दिए गए कमांड से, सूची में दिए गए सभी पैकेज डिपेंडेंसी को virtualenv में डाउनलोड किया गया.

App Engine ऐप्लिकेशन बनाना

इसके बाद, App Engine इंस्टेंस बनाएं. इसके लिए, यह तरीका अपनाएं:

gcloud app create

Storage बकेट बनाना

सबसे पहले, एनवायरमेंट वैरिएबल CLOUD_STORAGE_BUCKET को अपने PROJECT_ID के नाम के बराबर सेट करें. (आम तौर पर, यह सुझाव दिया जाता है कि आप अपने बकेट का नाम वही रखें जो आपके PROJECT_ID का नाम है, ताकि आपको आसानी हो).

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

हमारा ऐप्लिकेशन, Cloud Storage बकेट का इस्तेमाल करता है. आपको Cloud Shell से यह बकेट बनानी होगी. इसके लिए, gsutil नाम के टूल का इस्तेमाल करें. नीचे दिया गया कमांड चलाएं. इससे आपके PROJECT_ID के नाम से एक बकेट बन जाएगी.

gsutil mb gs://${PROJECT_ID}

ऐप्लिकेशन चलाना

python main.py

ऐप्लिकेशन शुरू होने के बाद, Cloud Shell टूलबार में मौजूद वेब प्रीव्यू आइकॉन पर क्लिक करें. इसके बाद, "पोर्ट 8080 पर झलक देखें" चुनें.

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

Screen Shot 2017-02-23 at 7.22.50 PM.png

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

फ़ोटो अपलोड करने के बाद, आपको कुछ ऐसा दिखेगा:

Screen Shot 2017-02-23 at 7.32.08 PM.png

सैंपल कोड का लेआउट

इस सैंपल का लेआउट ऐसा है:

templates/
  homepage.html   /* HTML template that uses Jinja2 */
app.yaml          /* App Engine application configuration file */
main.py           /* Python Flask web application */
requirements.txt  /* List of dependencies for the project */

main.py

यह Python फ़ाइल, Flask वेब ऐप्लिकेशन है. इस ऐप्लिकेशन में, उपयोगकर्ताओं को फ़ोटो सबमिट करने की सुविधा मिलती है. इसमें चेहरे की फ़ोटो सबमिट करने का सुझाव दिया जाता है. इन फ़ोटो को Cloud Storage में सेव किया जाता है. साथ ही, Cloud Vision API की फ़ेस डिटेक्शन सुविधा का इस्तेमाल करके इनका विश्लेषण किया जाता है. हर फ़ोटो के बारे में मुख्य जानकारी, Datastore में सेव की जाती है. यह Google Cloud Platform का NoSQL डेटाबेस है. जब भी कोई उपयोगकर्ता वेबसाइट पर आता है, तब इस जानकारी को ऐक्सेस किया जाता है.

यह ऐप्लिकेशन, Storage, Datastore, और Vision के लिए Google Cloud Platform क्लाइंट लाइब्रेरी का इस्तेमाल करता है. इन क्लाइंट लाइब्रेरी की मदद से, अपनी पसंदीदा प्रोग्रामिंग भाषाओं से Cloud API को आसानी से ऐक्सेस किया जा सकता है.

आइए, कोड के कुछ मुख्य स्निपेट पर नज़र डालते हैं.

सबसे ऊपर मौजूद इंपोर्ट सेक्शन में, हम अपने कोड के लिए ज़रूरी अलग-अलग पैकेज इंपोर्ट करते हैं. हम Datastore, Storage, और Vision के लिए, Google Cloud की क्लाइंट लाइब्रेरी को इस तरह इंपोर्ट करते हैं:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

यहां उस कोड के बारे में बताया गया है जो तब काम करता है, जब कोई उपयोगकर्ता वेबसाइट के रूट यूआरएल पर जाता है. हम एक Datastore क्लाइंट ऑब्जेक्ट बनाते हैं. इसका इस्तेमाल Datastore क्लाइंट लाइब्रेरी को ऐक्सेस करने के लिए किया जाता है. इसके बाद, हम Faces तरह की इकाइयों के लिए Datastore पर क्वेरी चलाते हैं. आखिर में, हम अपने एचटीएमएल टेंप्लेट को रेंडर करते हैं. इसमें हम Datastore से निकाले गए image_entities को वैरिएबल के तौर पर पास करते हैं.

@app.route('/')
def homepage():
    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Use the Cloud Datastore client to fetch information from Datastore about
    # each photo.
    query = datastore_client.query(kind='Faces')
    image_entities = list(query.fetch())

    # Return a Jinja2 HTML template and pass in image_entities as a parameter.
    return render_template('homepage.html', image_entities=image_entities)

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

हर इकाई में डेवलपर की तय की गई कई प्रॉपर्टी हो सकती हैं. इनमें कई तरह की वैल्यू हो सकती हैं. जैसे, पूर्णांक, फ़्लोट, स्ट्रिंग, तारीखें या बाइनरी डेटा.

    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Fetch the current date / time.
    current_datetime = datetime.now()

    # The kind for the new entity.
    kind = 'Faces'

    # The name/ID for the new entity.
    name = blob.name

    # Create the Cloud Datastore key for the new entity.
    key = datastore_client.key(kind, name)

    # Construct the new entity using the key. Set dictionary values for entity
    # keys blob_name, storage_public_url, timestamp, and joy.
    entity = datastore.Entity(key)
    entity['blob_name'] = blob.name
    entity['image_public_url'] = blob.public_url
    entity['timestamp'] = current_datetime
    entity['joy'] = face_joy

    # Save the new entity to Datastore.
    datastore_client.put(entity)

Datastore की तरह ही, Storage और Vision की क्लाइंट लाइब्रेरी को प्रोग्राम के हिसाब से ऐक्सेस किया जा सकता है. सभी सैंपल कोड देखने के लिए, main.py फ़ाइल को vim, emacs या nano का इस्तेमाल करके खुद खोलें.

Flask के बारे में ज़्यादा जानने के लिए, http://flask.pocoo.org/ पर जाएं.

क्लाइंट लाइब्रेरी के बारे में ज़्यादा जानने के लिए, https://googlecloudplatform.github.io/google-cloud-python/ पर जाएं.

homepage.html

Flask वेब फ़्रेमवर्क, Jinja2 को टेंप्लेट इंजन के तौर पर इस्तेमाल करता है. इससे हमें main.py से वैरिएबल और एक्सप्रेशन को homepage.html में पास करने की अनुमति मिलती है. पेज रेंडर होने के बाद, इन्हें वैल्यू से बदल दिया जाता है.

Jinja2 के बारे में ज़्यादा जानने के लिए, http://jinja.pocoo.org/docs/2.9/templates/ पर जाएं.

यह Jinja2 एचटीएमएल टेंप्लेट, उपयोगकर्ताओं को डेटाबेस में फ़ोटो सबमिट करने के लिए एक फ़ॉर्म दिखाता है. इसमें पहले सबमिट की गई हर इमेज के साथ-साथ, उसका फ़ाइल नाम, अपलोड करने की तारीख/समय, और Vision API से पता चला कि इमेज में दिख रहा चेहरा खुश है या नहीं, यह भी दिखता है.

homepage.html

<h1>Google Cloud Platform - Face Detection Sample</h1>

<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>

<br>

<html>
  <body>
    <form action="upload_photo" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    
  </body>
</html>

App Engine Flexible, app.yaml नाम की फ़ाइल का इस्तेमाल करता है. इससे किसी ऐप्लिकेशन के डिप्लॉयमेंट कॉन्फ़िगरेशन के बारे में जानकारी मिलती है. अगर यह फ़ाइल मौजूद नहीं है, तो App Engine डिप्लॉयमेंट कॉन्फ़िगरेशन का अनुमान लगाने की कोशिश करेगा. हालांकि, यह फ़ाइल देना बेहतर होता है.

इसके बाद, अपनी पसंद के एडिटर vim, nano या emacs का इस्तेमाल करके, app.yaml में बदलाव करें. हम nano एडिटर का इस्तेमाल करेंगे:

nano app.yaml

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3

env_variables:
    CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>

Python 3 App Engine Flex ऐप्लिकेशन को डिप्लॉय करने के लिए, यह बुनियादी कॉन्फ़िगरेशन ज़रूरी है. App Engine को कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, यहां जाएं.

app.yaml फ़ाइल खोलने के बाद, < your-cloud-storage-bucket > की जगह अपने Cloud Storage बकेट का नाम डालें. (अगर आपको अपने Cloud Storage बकेट का नाम याद नहीं है, तो Qwiklabs से GCP प्रोजेक्ट आईडी कॉपी करें. यह नाम वही है). env_variables सेक्शन, एनवायरमेंट वैरिएबल सेट अप करता है. इनका इस्तेमाल ऐप्लिकेशन डिप्लॉय होने के बाद, main.py में किया जाएगा.

अब nano में फ़ाइल को सेव करने और बंद करने के लिए, (Ctrl + x) का इस्तेमाल करें. इससे यह प्रॉम्प्ट दिखेगा:

Screen Shot 2017-02-17 at 4.47.12 PM.png

y टाइप करें. इसके बाद, फ़ाइल के नाम की पुष्टि करने के लिए, ENTER कुंजी को एक बार और दबाएं.

Screen Shot 2017-02-24 at 4.18.23 PM.png

gcloud का इस्तेमाल करके, अपने ऐप्लिकेशन को App Engine पर डिप्लॉय करें:

gcloud app deploy

ऐप्लिकेशन डिप्लॉय होने के बाद, इसे ऐक्सेस किया जा सकता है. इसके लिए, अपने वेब ब्राउज़र में https://< PROJECT_ID >.appspot.com यूआरएल खोलें.

खास जानकारी

इस चरण में, आपने Python वेब ऐप्लिकेशन सेट अप किया और उसे App Engine फ़्लेक्सिबल एनवायरमेंट में डिप्लॉय किया.

आपने अपना पहला App Engine Flexible वेब ऐप्लिकेशन लिखने और उसे डिप्लॉय करने का तरीका जान लिया है!

क्लीन अप

इस क्विकस्टार्ट में इस्तेमाल की गई संसाधनों के लिए, अपने Google Cloud Platform खाते से शुल्क न लिए जाने के लिए:

  • Cloud Platform Console पर जाएं.
  • वह प्रोजेक्ट चुनें जिसे बंद करना है. इसके बाद, सबसे ऊपर मौजूद ‘मिटाएं' पर क्लिक करें. इससे प्रोजेक्ट को मिटाने के लिए शेड्यूल कर दिया जाता है.

ज़्यादा जानें

लाइसेंस

इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.