1. परिचय
Python एक लोकप्रिय ओपन सोर्स प्रोग्रामिंग भाषा है. इसका इस्तेमाल डेटा साइंटिस्ट, वेब ऐप्लिकेशन डेवलपर, सिस्टम एडमिन वगैरह करते हैं.
Cloud Functions, इवेंट पर आधारित बिना सर्वर वाला कंप्यूट प्लैटफ़ॉर्म है. Cloud Functions, आपको संसाधनों के प्रावधान या बदलती ज़रूरतों को पूरा करने के लिए स्केल करने की चिंता किए बिना अपना कोड लिखने देता है.
Cloud फ़ंक्शन दो तरह के होते हैं:
- एचटीटीपी फ़ंक्शन, एचटीटीपी अनुरोधों का जवाब देते हैं. इस कोडलैब में, आपको कुछ जोड़ना होगा.
- बैकग्राउंड फ़ंक्शन, इवेंट से ट्रिगर होते हैं. जैसे, Cloud Pub/Sub पर पब्लिश होने वाला मैसेज या Cloud Storage में अपलोड की गई फ़ाइल. हम इस लैब में इस समस्या को हल नहीं करते. हालांकि, दस्तावेज़ में इस बारे में ज़्यादा जानकारी दी गई है.
यह कोडलैब आपको Python में अपने Cloud Functions बनाने में मदद करेगा.
आपको क्या बनाना होगा
इस कोडलैब में, आपको एक ऐसा Cloud फ़ंक्शन पब्लिश करना होगा जो एचटीटीपी के ज़रिए शुरू किए जाने पर, "Python संचालित" दिखता हो लोगो:
आप इन चीज़ों के बारे में जानेंगे
- एचटीटीपी क्लाउड फ़ंक्शन लिखने का तरीका.
- आर्ग्युमेंट लेने वाला एचटीटीपी Cloud फ़ंक्शन लिखने का तरीका.
- एचटीटीपी क्लाउड फ़ंक्शन की जांच करने का तरीका.
- इस फ़ंक्शन को आज़माने के लिए, स्थानीय Python एचटीटीपी सर्वर को चलाने का तरीका.
- ऐसे एचटीटीपी Cloud फ़ंक्शन को लिखने का तरीका जो इमेज दिखाता है.
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करें
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको अपना प्रोजेक्ट आईडी बताना होगा. आम तौर पर, इसकी पहचान
PROJECT_ID
के रूप में की जाती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. दूसरा तरीका यह है कि आप खुद भी आज़माकर देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. साथ ही, यह प्रोजेक्ट के खत्म होने तक बना रहता है. - आपकी जानकारी के लिए, प्रोजेक्ट नंबर नाम की एक तीसरी वैल्यू दी गई है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.
क्लाउड शेल शुरू करें
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Cloud Shell चालू करें
- Cloud Console में, Cloud Shell चालू करें
पर क्लिक करें.
अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.
प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.
इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह Google Cloud में काम करती है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाने में मदद करती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.
Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.
- यह पुष्टि करने के लिए 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`
- 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}! 🚀"
- Python टेस्ट की तरह ही अन्य Python फ़ाइलों को लिखा जाता है. ये इंपोर्ट के सेट से शुरुआत करते हैं. इसके बाद, क्लास और फ़ंक्शन तय करते हैं.
- जांच का एलान,
class TestHello(TestCase)
फ़ॉर्मैट में होता है. यह ऐसी क्लास होनी चाहिए जोunittest.TestCase
से इनहेरिट की गई हो. - टेस्ट क्लास में ऐसे तरीके होते हैं जिनमें से हर तरीके की शुरुआत
test_
से होनी चाहिए. ये तरीके अलग-अलग टेस्ट केस के बारे में बताते हैं. - हर टेस्ट केस,
request
पैरामीटर का मॉक टेस्ट करके हमारे किसी एक फ़ंक्शन की जांच करता है. इसका मतलब है कि इसे टेस्ट के लिए ज़रूरी डेटा को किसी नकली ऑब्जेक्ट से बदला जाता है. - हर फ़ंक्शन को शुरू करने के बाद, टेस्ट एचटीटीपी रिस्पॉन्स की जांच करके पक्का करता है कि यह वही रिस्पॉन्स है जिसकी हमें उम्मीद थी.
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" टूल का इस्तेमाल किया जाता है हर अनुरोध के लिए इमेज:
निम्न प्रविष्टि ऐसा कोड दिखाती है, जिससे ऐसा किया जा सकता है:
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)
- यह फ़ाइल एक फ़्लास्क ऐप्लिकेशन बनाती है.
- यह बेस यूआरएल पर एक रूट रजिस्टर करता है, जिसे
index()
नाम के फ़ंक्शन से हैंडल किया जाता है. - इसके बाद
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 पर पूर्वावलोकन" चुनें:
Cloud Shell, नई ब्राउज़र विंडो में अपनी प्रॉक्सी सेवा पर झलक दिखाने वाले यूआरएल को खोलता है. वेब झलक, एचटीटीपीएस पर ऐक्सेस करने से सिर्फ़ आपके उपयोगकर्ता खाते को प्रतिबंधित करती है. अगर सब कुछ ठीक से काम कर रहा है, तो आपको "Python संचालित" दिखेगा लोगो!
8. बधाई हो!
आपने मुहावरेदार फ़ंक्शन का इस्तेमाल करके एचटीटीपी 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 इस्तेमाल करने में मज़ा आएगा!