Python में एचटीटीपी Cloud Functions

1. परिचय

b158ce75c3cccd6d.png

Python एक लोकप्रिय ओपन सोर्स प्रोग्रामिंग लैंग्वेज है. इसका इस्तेमाल डेटा साइंटिस्ट, वेब ऐप्लिकेशन डेवलपर, सिस्टम एडमिन वगैरह करते हैं.

Cloud Functions, इवेंट-ड्रिवन और बिना सर्वर वाला कंप्यूट प्लैटफ़ॉर्म है. Cloud Functions की मदद से, कोड लिखा जा सकता है. इसके लिए, आपको संसाधनों का प्रावधान करने या बदलती ज़रूरतों को पूरा करने के लिए, कोड को स्केल करने की चिंता करने की ज़रूरत नहीं है.

Cloud Functions दो तरह के होते हैं:

  • एचटीटीपी फ़ंक्शन, एचटीटीपी अनुरोधों का जवाब देते हैं. इस कोडलैब में, आपको कुछ ऐप्लिकेशन बनाने का मौका मिलेगा.
  • बैकग्राउंड फ़ंक्शन, इवेंट से ट्रिगर होते हैं. जैसे, Cloud Pub/Sub पर कोई मैसेज पब्लिश होना या Cloud Storage पर कोई फ़ाइल अपलोड होना. हम इस लैब में इस बारे में बात नहीं करेंगे. हालांकि, इसके बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.

efb3268e3b74ed4f.png

इस कोडलैब में, Python में Cloud Functions बनाने का तरीका बताया जाएगा.

आपको क्या बनाना होगा

इस कोडलैब में, आपको एक Cloud फ़ंक्शन पब्लिश करना होगा. एचटीटीपी के ज़रिए कॉल किए जाने पर, यह फ़ंक्शन "Python Powered" लोगो दिखाता है:

a7aaf656b78050fd.png

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

  • एचटीटीपी Cloud फ़ंक्शन लिखने का तरीका.
  • आर्ग्युमेंट लेने वाला एचटीटीपी Cloud फ़ंक्शन लिखने का तरीका.
  • एचटीटीपी Cloud फ़ंक्शन को टेस्ट करने का तरीका.
  • फ़ंक्शन को आज़माने के लिए, लोकल Python एचटीटीपी सर्वर को चलाने का तरीका.
  • इमेज दिखाने वाला एचटीटीपी Cloud फ़ंक्शन लिखने का तरीका.

2. सेटअप और ज़रूरी शर्तें

अपनी रफ़्तार से एनवायरमेंट सेटअप करना

  1. Google Cloud Console में साइन-इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

fbef9caa1602edd0.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह वर्णों की एक स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. आपके पास इसे किसी भी समय अपडेट करने का विकल्प होता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको इस बात की चिंता करने की ज़रूरत नहीं होती कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर, PROJECT_ID के तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, अपनी पसंद का कोई हैंडल आज़माकर देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के खत्म होने तक लागू रहता है.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. कुछ एपीआई इसका इस्तेमाल करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को पूरा करने में आपको ज़्यादा खर्च नहीं करना पड़ेगा. इस ट्यूटोरियल के बाद, बिलिंग से बचने के लिए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों या प्रोजेक्ट को मिटाया जा सकता है. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलेगा.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से रिमोटली इस्तेमाल किया जा सकता है. हालांकि, इस कोडलैब में आपको Cloud Shell का इस्तेमाल करना होगा. यह क्लाउड में चलने वाला एक कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

3c1dabeca90e44e5.png

अगर Cloud Shell को पहली बार शुरू किया जा रहा है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

Cloud Shell को सेट अप करने और उससे कनेक्ट होने में कुछ ही समय लगता है.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल मौजूद होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में, आपका ज़्यादातर काम ब्राउज़र से किया जा सकता है. हालांकि, कुछ काम के लिए आपको अन्य टूल की ज़रूरत पड़ सकती है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.

  1. Cloud Shell में यह कमांड चलाकर पुष्टि करें कि आपकी पहचान की पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस निर्देश की मदद से इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

पक्का करें कि Cloud Functions और Cloud Build API चालू हों

Cloud Shell से यह कमांड चलाकर पक्का करें कि Cloud Functions और Cloud Build एपीआई चालू हों:

gcloud services enable \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com

ध्यान दें: Cloud Build को gcloud functions deploy कमांड से कॉल किया जाएगा. यह आपके कोड को कंटेनर इमेज में अपने-आप बदल देगा.

सोर्स कोड डाउनलोड करना

Cloud Shell टर्मिनल से, ये कमांड चलाएं:

REPO_NAME="codelabs"
REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME"
SOURCE_DIR="cloud-functions-python-http"

git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL
cd $REPO_NAME
git sparse-checkout set $SOURCE_DIR
git checkout
cd $SOURCE_DIR

सोर्स डायरेक्ट्री का कॉन्टेंट देखें:

ls

आपके पास ये फ़ाइलें होनी चाहिए:

main.py  python-powered.png  test_main.py  web_app.py

3. एचटीटीपी Cloud Functions के बारे में जानकारी

Python में एचटीटीपी Cloud Functions को सामान्य Python फ़ंक्शन के तौर पर लिखा जाता है. फ़ंक्शन में सिर्फ़ एक flask.Request आर्ग्युमेंट होना चाहिए. आम तौर पर, इसका नाम request होता है.

main.py

import flask


def hello_world(request: flask.Request) -> flask.Response:
    """HTTP Cloud Function.

    Returns:
    - "Hello World! 👋"
    """
    response = "Hello World! 👋"

    return flask.Response(response, mimetype="text/plain")

# ...

फ़ाइल को अपने पसंदीदा कमांड लाइन एडिटर (नैनो, विम या ईमैक्स) से खोला जा सकता है. सोर्स डायरेक्ट्री को फ़ाइल फ़ोल्डर के तौर पर सेट करने के बाद, इसे Cloud Shell Editor में भी खोला जा सकता है:

cloudshell open-workspace .

आइए, इस फ़ंक्शन को एचटीटीपी Cloud फ़ंक्शन के तौर पर डिप्लॉय करें. इसके लिए, gcloud functions deploy कमांड का इस्तेमाल करें:

FUNCTION_NAME="hello_world"

gcloud functions deploy $FUNCTION_NAME \
  --runtime python312 \
  --trigger-http \
  --allow-unauthenticated

कमांड आउटपुट:

...
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
...
entryPoint: FUNCTION_NAME
httpsTrigger:
  url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
...

gcloud functions deploy के विकल्पों के बारे में नोट:

  • --runtime: इससे भाषा के रनटाइम के बारे में पता चलता है. Python के लिए, फ़िलहाल यह python37, python38, python39, python310 या python312 हो सकता है. रनटाइम देखें.
  • --trigger-http: फ़ंक्शन को एक एंडपॉइंट असाइन किया जाएगा. एंडपॉइंट पर एचटीटीपी अनुरोध (POST, PUT, GET, DELETE, और OPTIONS) भेजने पर, फ़ंक्शन ट्रिगर हो जाएगा.
  • --allow-unauthenticated: फ़ंक्शन सार्वजनिक होगा. इससे सभी कॉलर को अनुमति मिलेगी. इसके लिए, पुष्टि करने की ज़रूरत नहीं होगी.
  • ज़्यादा जानने के लिए, gcloud functions deploy देखें.

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

URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)")
curl -w "\n" $URL

आपको यह नतीजा मिलना चाहिए:

Hello World! 👋

4. आर्ग्युमेंट लेने वाला एचटीटीपी Cloud फ़ंक्शन लिखना

आर्ग्युमेंट स्वीकार करने पर, फ़ंक्शन ज़्यादा बेहतर तरीके से काम करते हैं. आइए, एक नया फ़ंक्शन hello_name तय करें, जो name पैरामीटर के साथ काम करता है:

main.py

# ...

def hello_name(request: flask.Request) -> flask.Response:
    """HTTP Cloud Function.

    Returns:
    - "Hello {NAME}! 🚀" if "name=NAME" is defined in the GET request
    - "Hello World! 🚀" otherwise
    """
    name = request.args.get("name", "World")
    response = f"Hello {name}! 🚀"

    return flask.Response(response, mimetype="text/plain")

# ...

चलिए, इस नए फ़ंक्शन को डिप्लॉय करते हैं:

FUNCTION_NAME="hello_name"

gcloud functions deploy $FUNCTION_NAME \
  --runtime python312 \
  --trigger-http \
  --allow-unauthenticated

कमांड आउटपुट:

...
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
...
entryPoint: FUNCTION_NAME
httpsTrigger:
  url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
...

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

URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)")
curl -w "\n" $URL

आपको डिफ़ॉल्ट नतीजा मिलना चाहिए:

Hello World! 🚀

आपको डिफ़ॉल्ट नतीजा मिल रहा है, क्योंकि name आर्ग्युमेंट सेट नहीं है. यूआरएल में कोई पैरामीटर जोड़ें:

curl -w "\n" $URL?name=YOUR%20NAME

इस बार, आपको अपनी पसंद के मुताबिक जवाब मिलेगा:

Hello YOUR NAME! 🚀

अगला चरण, यूनिट टेस्ट जोड़ना है. इससे यह पक्का किया जा सकता है कि सोर्स कोड अपडेट होने पर भी आपके फ़ंक्शन सही तरीके से काम करते रहें.

5. टेस्ट लिखना

Python में एचटीटीपी Cloud Functions की जांच, स्टैंडर्ड लाइब्रेरी के unittest मॉड्यूल का इस्तेमाल करके की जाती है. अपने फ़ंक्शन को टेस्ट करने के लिए, किसी एम्युलेटर या अन्य सिम्युलेशन को चलाने की ज़रूरत नहीं है. इसके लिए, सिर्फ़ सामान्य Python कोड की ज़रूरत होती है.

यहां hello_world और hello_name फ़ंक्शन के लिए टेस्ट का उदाहरण दिया गया है:

test_main.py

import unittest
import unittest.mock

import main


class TestHello(unittest.TestCase):
    def test_hello_world(self):
        request = unittest.mock.Mock()

        response = main.hello_world(request)
        assert response.status_code == 200
        assert response.get_data(as_text=True) == "Hello World! 👋"

    def test_hello_name_no_name(self):
        request = unittest.mock.Mock(args={})

        response = main.hello_name(request)
        assert response.status_code == 200
        assert response.get_data(as_text=True) == "Hello World! 🚀"

    def test_hello_name_with_name(self):
        name = "FirstName LastName"
        request = unittest.mock.Mock(args={"name": name})

        response = main.hello_name(request)
        assert response.status_code == 200
        assert response.get_data(as_text=True) == f"Hello {name}! 🚀"
  1. Python टेस्ट, अन्य Python फ़ाइलों की तरह ही लिखे जाते हैं. ये इंपोर्ट के सेट से शुरू होते हैं. इसके बाद, क्लास और फ़ंक्शन तय करते हैं.
  2. टेस्ट एलान, class TestHello(TestCase) फ़ॉर्मैट में होता है. यह ऐसी क्लास होनी चाहिए जो unittest.TestCase से इनहेरिट की गई हो.
  3. टेस्ट क्लास में कई तरीके होते हैं. इनमें से हर एक को test_ से शुरू होना चाहिए. ये अलग-अलग टेस्ट केस को दिखाते हैं.
  4. हर टेस्ट केस, हमारे किसी एक फ़ंक्शन की जांच करता है. इसके लिए, वह request पैरामीटर को मॉक करता है. इसका मतलब है कि वह पैरामीटर को किसी नकली ऑब्जेक्ट से बदल देता है. इस नकली ऑब्जेक्ट में, टेस्ट के लिए ज़रूरी डेटा होता है.
  5. हर फ़ंक्शन को शुरू करने के बाद, टेस्ट में एचटीटीपी रिस्पॉन्स की जांच की जाती है. इससे यह पक्का किया जाता है कि रिस्पॉन्स हमारी उम्मीद के मुताबिक हो.

main.py, flask पर निर्भर करता है. इसलिए, पक्का करें कि आपके टेस्ट एनवायरमेंट में Flask फ़्रेमवर्क इंस्टॉल हो:

pip install flask

Flask इंस्टॉल करने पर, आपको इस तरह का आउटपुट मिलता है:

Collecting flask
...
Successfully installed ... flask-3.0.2 ...

इन टेस्ट को लोकल लेवल पर चलाएं:

python -m unittest

तीनों यूनिट टेस्ट पास होने चाहिए:

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

इसके बाद, आपको एक नया फ़ंक्शन बनाना होगा, जो "Python Powered" लोगो दिखाता है.

6. "Python की मदद से" एचटीटीपी Cloud फ़ंक्शन लिखना

आइए, हर अनुरोध के लिए "Python Powered" इमेज दिखाकर, नए फ़ंक्शन को थोड़ा और दिलचस्प बनाएं:

a7aaf656b78050fd.png

यहां दी गई सूची में, ऐसा करने के लिए कोड दिखाया गया है:

main.py

# ...

def python_powered(request: flask.Request) -> flask.Response:
    """HTTP Cloud Function.

    Returns:
    - The official "Python Powered" logo
    """
    return flask.send_file("python-powered.png")

नया python_powered फ़ंक्शन डिप्लॉय करें:

FUNCTION_NAME="python_powered"

gcloud functions deploy $FUNCTION_NAME \
  --runtime python312 \
  --trigger-http \
  --allow-unauthenticated

कमांड आउटपुट:

...
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
...
entryPoint: FUNCTION_NAME
httpsTrigger:
  url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
...

फ़ंक्शन की जांच करने के लिए, ऊपर दिए गए कमांड आउटपुट में दिखाए गए httpsTrigger.url यूआरएल पर क्लिक करें. अगर सब कुछ सही तरीके से काम कर रहा है, तो आपको एक नए ब्राउज़र टैब में "Python Powered" लोगो दिखेगा!

इसके बाद, आपको एक ऐप्लिकेशन बनाना होगा, ताकि डिप्लॉय करने से पहले फ़ंक्शन को स्थानीय तौर पर चलाया और आज़माया जा सके.

7. फ़ंक्शन को स्थानीय तौर पर चलाना

वेब ऐप्लिकेशन बनाकर और किसी रूट में अपने फ़ंक्शन को कॉल करके, एचटीटीपी फ़ंक्शन को स्थानीय तौर पर चलाया जा सकता है. इसे अपने फ़ंक्शन की डायरेक्ट्री में जोड़ा जा सकता है. web_app.py नाम की फ़ाइल में यह कॉन्टेंट है:

web_app.py

import flask

import main

app = flask.Flask(__name__)


@app.get("/")
def index():
    return main.python_powered(flask.request)


if __name__ == "__main__":
    # Local development only
    # Run "python web_app.py" and open http://localhost:8080
    app.run(host="localhost", port=8080, debug=True)
  1. यह फ़ाइल, Flask ऐप्लिकेशन बनाती है.
  2. यह बेस यूआरएल पर एक रूट रजिस्टर करता है. इसे index() नाम के फ़ंक्शन से मैनेज किया जाता है.
  3. इसके बाद, index() फ़ंक्शन हमारे python_powered फ़ंक्शन को कॉल करता है और उसे मौजूदा अनुरोध पास करता है.

पक्का करें कि आपके डेवलपमेंट एनवायरमेंट में Flask फ़्रेमवर्क इंस्टॉल हो:

pip install flask

Flask इंस्टॉल करने पर, आपको इस तरह का आउटपुट मिलता है:

Collecting flask
...
Successfully installed ... flask-3.0.2 ...

इस ऐप्लिकेशन को स्थानीय तौर पर चलाने के लिए, यह कमांड चलाएं:

python web_app.py

अब अपने ब्राउज़र में वेब ऐप्लिकेशन की जांच करने के लिए, Cloud Shell वेब की झलक का इस्तेमाल करें. Cloud Shell में, "वेब की झलक" बटन पर क्लिक करें और "पोर्ट 8080 पर झलक देखें" को चुनें:

6c9ff9e5c692c58e.gif

Cloud Shell, ब्राउज़र की नई विंडो में अपनी प्रॉक्सी सेवा पर झलक दिखाने वाला यूआरएल खोलता है. वेब की झलक, एचटीटीपीएस पर ऐक्सेस को सिर्फ़ आपके उपयोगकर्ता खाते तक सीमित करती है. अगर सब कुछ ठीक से काम कर रहा है, तो आपको "Python Powered" लोगो दिखेगा!

8e5c3ead11cfd103.png

8. बधाई हो!

b158ce75c3cccd6d.png

आपने एचटीटीपी Cloud Functions डिप्लॉय किए हैं. इसके लिए, आपने ऐसे फ़ंक्शन इस्तेमाल किए हैं जो Flask फ़्रेमवर्क की मदद से वेब के अनुरोधों को मैनेज करते हैं.

Cloud Functions की कीमत इस बात पर निर्भर करती है कि आपके फ़ंक्शन को कितनी बार शुरू किया जाता है. इसमें उन फ़ंक्शन के लिए फ़्री टियर शामिल है जो अक्सर नहीं चलते. Cloud Functions की जांच करने के बाद, उन्हें मिटाया जा सकता है. इसके लिए, gcloud का इस्तेमाल करें:

gcloud functions delete hello_world --quiet
gcloud functions delete hello_name --quiet
gcloud functions delete python_powered --quiet

Google Cloud console से भी फ़ंक्शन मिटाए जा सकते हैं.

हमें उम्मीद है कि आपको Python में Cloud Functions का इस्तेमाल करने में मज़ा आएगा!