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

1. परिचय

b158ce75c3cccd6d.png

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

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

Cloud फ़ंक्शन दो तरह के होते हैं:

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

efb3268e3b74ed4f.png

यह कोडलैब आपको Python में अपने Cloud Functions बनाने में मदद करेगा.

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

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

a7aaf656b78050fd.png

आप इन चीज़ों के बारे में जानेंगे

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

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

अपने हिसाब से एनवायरमेंट सेटअप करें

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

क्लाउड शेल शुरू करें

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

Cloud Shell चालू करें

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

3c1dabeca90e44e5.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह 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 के एपीआई चालू हों

Cloud शेल से यह कमांड चलाएं, ताकि यह पक्का किया जा सके कि Cloud Functions और Cloud Build API चालू हैं या नहीं:

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. पेश है एचटीटीपी क्लाउड फ़ंक्शन

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")

# ...

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

cloudshell open-workspace .

इस फ़ंक्शन को 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: फ़ंक्शन को एक एंडपॉइंट असाइन किया जाएगा. एंडपॉइंट पर एचटीटीपी अनुरोध (पीओएसटी, PUT, GET, DELETE, और OPTIONS) फ़ंक्शन, फ़ंक्शन के एक्ज़ीक्यूशन को ट्रिगर करेंगे.
  • --allow-unauthenticated: यह फ़ंक्शन, पुष्टि किए बिना सभी कॉलर को अनुमति देता है और सबके लिए उपलब्ध होता है.
  • ज़्यादा जानने के लिए, gcloud फ़ॉर्मूला डिप्लॉय लेख पढ़ें.

फ़ंक्शन की जांच करने के लिए, ऊपर दिए गए कमांड आउटपुट में दिख रहे 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 पर निर्भर करता है. इसलिए, पक्का करें कि आपके टेस्ट एनवायरमेंट में फ़्लास्क फ़्रेमवर्क इंस्टॉल किया गया हो:

pip install flask

फ़्लास्क को इंस्टॉल करने से मिलने वाला नतीजा मिलता-जुलता है:

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

इन जांचों को स्थानीय तौर पर चलाएं:

python -m unittest

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

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

OK

इसके बाद, आपको एक नया फ़ंक्शन बनाना होगा, जो "PythonPower" के बारे में फिर से जानकारी देगा लोगो.

6. "PythonPower" विषय के बारे में जानकारी एचटीटीपी क्लाउड फ़ंक्शन

आइए, एक नए फ़ंक्शन को और मज़ेदार बनाते हैं. इसके लिए, "PythonPower" टूल का इस्तेमाल किया जाता है हर अनुरोध के लिए इमेज:

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 संचालित" दिखेगा नए ब्राउज़र टैब में लोगो!

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

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

आप एक वेब ऐप्लिकेशन बनाकर और अपने फ़ंक्शन को किसी रूट में कॉल करके स्थानीय रूप से HTTP फ़ंक्शन को चला सकते हैं. इसे उसी डायरेक्ट्री में जोड़ा जा सकता है जिसमें फ़ंक्शन है. 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. यह फ़ाइल एक फ़्लास्क ऐप्लिकेशन बनाती है.
  2. यह बेस यूआरएल पर एक रूट रजिस्टर करता है, जिसे index() नाम के फ़ंक्शन से हैंडल किया जाता है.
  3. इसके बाद index() फ़ंक्शन हमारे python_powered फ़ंक्शन को कॉल करके मौजूदा अनुरोध को पास करता है.

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

pip install flask

फ़्लास्क को इंस्टॉल करने से मिलने वाला नतीजा मिलता-जुलता है:

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

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

python web_app.py

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

6c9ff9e5c692c58e.gif

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

8e5c3ead11cfd103.png

8. बधाई हो!

b158ce75c3cccd6d.png

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

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 इस्तेमाल करने में मज़ा आएगा!