إعداد واجهة برمجة تطبيقات باستخدام Flask و Cloud SQL و App Engine من Google
نشرت: 2022-03-10يمكن استخدام عدد قليل من أطر عمل Python لإنشاء واجهات برمجة تطبيقات ، اثنان منها هما Flask و Django. تأتي الأطر بوظائف تسهل على المطورين تنفيذ الميزات التي يحتاجها المستخدمون للتفاعل مع تطبيقاتهم. يمكن أن يكون تعقيد تطبيق الويب عاملاً حاسمًا عند اختيار إطار العمل الذي تعمل به.
جانغو
يعد Django إطار عمل قويًا له بنية محددة مسبقًا بوظائف مدمجة. ومع ذلك ، فإن الجانب السلبي لقوتها هو أنها يمكن أن تجعل إطار العمل معقدًا للغاية بالنسبة لبعض المشاريع. إنها الأنسب لتطبيقات الويب المعقدة التي تحتاج إلى الاستفادة من الوظائف المتقدمة لـ Django.
قارورة
من ناحية أخرى ، يعد Flask إطارًا خفيف الوزن لبناء واجهات برمجة التطبيقات. الشروع في ذلك أمر سهل ، والحزم متاحة لجعلها قوية كما تذهب. ستركز هذه المقالة على تحديد وظائف العرض ووحدة التحكم وعلى الاتصال بقاعدة بيانات على Google Cloud والنشر في Google Cloud.
لغرض التعلم ، سننشئ Flask API مع عدد قليل من نقاط النهاية لإدارة مجموعة من الأغاني المفضلة لدينا. ستكون نقاط النهاية لطلبات GET
و POST
: جلب الموارد وإنشائها. إلى جانب ذلك ، سنستخدم مجموعة الخدمات على منصة Google Cloud. سنقوم بإعداد Cloud SQL من Google لقاعدة بياناتنا ونطلق تطبيقنا من خلال النشر إلى App Engine. يستهدف هذا البرنامج التعليمي المبتدئين الذين يتخذون أول خطوة في استخدام Google Cloud لتطبيقهم.
إنشاء مشروع قارورة
يفترض هذا البرنامج التعليمي أن لديك Python 3.x مثبت. إذا لم تقم بذلك ، فانتقل إلى الموقع الرسمي لتنزيله وتثبيته.
للتحقق مما إذا تم تثبيت Python ، قم بتشغيل واجهة سطر الأوامر (CLI) وقم بتشغيل الأمر أدناه:
python -V
خطوتنا الأولى هي إنشاء الدليل الذي سيعيش فيه مشروعنا. سوف نسميها flask-app
:
mkdir flask-app && cd flask-app
أول شيء يجب فعله عند بدء مشروع Python هو إنشاء بيئة افتراضية. تعزل البيئات الافتراضية تطوير Python الذي تعمل به. هذا يعني أن هذا المشروع يمكن أن يكون له تبعيات خاصة به ، تختلف عن مشروع آخر على أجهزتك. venv هي وحدة يتم شحنها مع Python 3.
لنقم بإنشاء بيئة افتراضية في دليل flask-app
:
python3 -m venv env
يقوم هذا الأمر بإنشاء مجلد env
في دليلنا. الاسم (في هذه الحالة ، env
) هو اسم مستعار للبيئة الافتراضية ويمكن تسميته بأي شيء.
الآن بعد أن أنشأنا البيئة الافتراضية ، علينا إخبار مشروعنا باستخدامها. لتفعيل بيئتنا الافتراضية ، استخدم الأمر التالي:
source env/bin/activate
سترى أن موجه CLI الخاص بك له env
في البداية ، مما يشير إلى أن بيئتنا نشطة.
الآن ، دعنا نثبت حزمة Flask الخاصة بنا:
pip install flask
قم بإنشاء دليل يسمى api
في دليلنا الحالي. نحن نقوم بإنشاء هذا الدليل بحيث يكون لدينا مجلد حيث توجد مجلدات تطبيقنا الأخرى.
mkdir api && cd api
بعد ذلك ، قم بإنشاء ملف main.py
، والذي سيكون بمثابة نقطة الدخول إلى تطبيقنا:
touch main.py
افتح main.py
، وأدخل الكود التالي:
#main.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello World' if __name__ == '__main__': app.run()
دعونا نفهم ما فعلناه هنا. قمنا أولاً باستيراد فئة Flask
من حزمة Flask. بعد ذلك ، أنشأنا مثيلًا للفئة وقمنا بتعيينه app
. بعد ذلك ، أنشأنا نقطة النهاية الأولى ، والتي تشير إلى جذر تطبيقنا. باختصار ، هذه وظيفة عرض تستدعي المسار /
- تقوم بإرجاع Hello World
.
لنقم بتشغيل التطبيق:
python main.py
هذا يبدأ خادمنا المحلي ويخدم تطبيقنا على https://127.0.0.1:5000/
. أدخل عنوان URL في متصفحك ، وسترى استجابة Hello World
مطبوعة على شاشتك.
وفويلا! تطبيقنا قيد التشغيل. المهمة التالية هي جعلها عملية.
للاتصال بنقاط النهاية الخاصة بنا ، سنستخدم Postman ، وهي خدمة تساعد المطورين على اختبار نقاط النهاية. يمكنك تنزيله من الموقع الرسمي.
لنجعل main.py
نعيد بعض البيانات:
#main.py from flask import Flask, jsonify app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) if __name__ == '__main__': app.run()
هنا ، قمنا بتضمين قائمة الأغاني ، بما في ذلك عنوان الأغنية واسم الفنان. ثم قمنا بتغيير الجذر /
المسار إلى /songs
. يعرض هذا المسار مجموعة الأغاني التي حددناها. من أجل الحصول على قائمتنا كقيمة JSON ، قمنا بتحديث القائمة من خلال JSON بتمريرها عبر jsonify
. الآن ، بدلاً من رؤية Hello world
بسيط ، نرى قائمة بالفنانين عندما نصل إلى https://127.0.0.1:5000/songs
نقطة النهاية.
ربما لاحظت أنه بعد كل تغيير ، كان علينا إعادة تشغيل خادمنا. لتمكين إعادة التحميل التلقائي عند تغيير الرمز ، دعنا نقوم بتمكين خيار التصحيح. للقيام بذلك ، قم بتغيير app.run
إلى هذا:
app.run(debug=True)
بعد ذلك ، دعنا نضيف أغنية باستخدام طلب نشر إلى صفيفنا. أولاً ، قم باستيراد كائن request
، حتى نتمكن من معالجة الطلب الوارد من مستخدمينا. سنستخدم لاحقًا كائن request
في وظيفة العرض للحصول على مدخلات المستخدم في JSON.
#main.py from flask import Flask, jsonify, request app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) @app.route('/songs', methods=['POST']) def add_songs(): song = request.get_json() songs.append(song) return jsonify(songs) if __name__ == '__main__': app.run(debug=True)
تأخذ وظيفة عرض add_songs
أغنية مقدمة من المستخدم وإلحاقها بقائمة الأغاني الموجودة لدينا.
حتى الآن ، أعدنا بياناتنا من قائمة Python. هذا مجرد تجريبي ، لأنه في بيئة أكثر قوة ، ستفقد بياناتنا المضافة حديثًا إذا أعدنا تشغيل الخادم. هذا غير ممكن ، لذلك سنطلب قاعدة بيانات مباشرة لتخزين واسترداد البيانات. يأتي Cloud SQL.
لماذا استخدام مثيل Cloud SQL؟
وبحسب الموقع الرسمي:
"Google Cloud SQL هي خدمة قاعدة بيانات مُدارة بالكامل تسهل إعداد قواعد بيانات MySQL و PostgreSQL الارتباطية وصيانتها وإدارتها وإدارتها في السحابة. توفر Cloud SQL ، المستضافة على Google Cloud Platform ، بنية أساسية لقواعد البيانات للتطبيقات التي تعمل في أي مكان ".
هذا يعني أنه يمكننا الاستعانة بمصادر خارجية لإدارة البنية التحتية لقاعدة البيانات بالكامل لشركة Google ، وبأسعار مرنة.
الفرق بين Cloud SQL ومحرك الحوسبة المدار ذاتيًا
على Google Cloud ، يمكننا تشغيل آلة افتراضية على البنية التحتية لمحرك Google وتثبيت مثيل SQL الخاص بنا. هذا يعني أننا سنكون مسؤولين عن قابلية التوسع الرأسي والنسخ المتماثل ومجموعة من التكوينات الأخرى. باستخدام Cloud SQL ، نحصل على الكثير من التهيئة خارج الصندوق ، حتى نتمكن من قضاء المزيد من الوقت على الكود ووقت أقل في الإعداد.
قبل أن نبدأ:
- اشترك في جوجل كلاود. تقدم Google 300 دولار كائتمان مجاني للمستخدمين الجدد.
- أنشئ مشروعًا. هذا واضح ومباشر ويمكن القيام به مباشرة من وحدة التحكم.
إنشاء مثيل Cloud SQL
بعد الاشتراك في Google Cloud ، في اللوحة اليمنى ، قم بالتمرير إلى علامة التبويب "SQL" وانقر عليها.
أولاً ، نحن مطالبون باختيار محرك SQL. سنذهب مع MySQL لهذه المقالة.
بعد ذلك ، سننشئ مثيلاً. بشكل افتراضي ، سيتم إنشاء مثيلنا في الولايات المتحدة ، وسيتم تحديد المنطقة تلقائيًا لنا.
قم بتعيين كلمة مرور الجذر وقم بتسمية المثيل ، ثم انقر فوق الزر "إنشاء". يمكنك أيضًا تكوين المثيل بالنقر فوق القائمة المنسدلة "إظهار خيارات التكوين". تتيح لك الإعدادات تكوين حجم المثيل وسعة التخزين والأمان والتوافر والنسخ الاحتياطية والمزيد. بالنسبة لهذه المقالة ، سنذهب مع الإعدادات الافتراضية. لا داعي للقلق ، يمكن تغيير هذه المتغيرات لاحقًا.
قد تستغرق العملية بضع دقائق حتى تنتهي. ستعرف أن المثيل جاهز عندما ترى علامة اختيار خضراء. انقر فوق اسم المثيل الخاص بك للانتقال إلى صفحة التفاصيل.
الآن ، بعد أن بدأنا العمل ، سنفعل بعض الأشياء:
- أنشئ قاعدة بيانات.
- قم بإنشاء مستخدم جديد.
- أضف عنوان IP الخاص بنا إلى القائمة البيضاء.
أنشئ قاعدة بيانات
انتقل إلى علامة التبويب "قاعدة بيانات" لإنشاء قاعدة بيانات.
إنشاء مستخدم جديد
في قسم "اسم المضيف" ، اضبطه للسماح بـ "٪ (أي مضيف)".
القائمة البيضاء لعنوان IP
يمكنك الاتصال بطبعة قاعدة البيانات الخاصة بك بإحدى طريقتين. يتطلب عنوان IP الخاص سحابة افتراضية خاصة (VPC). إذا اخترت هذا الخيار ، فسيقوم Google Cloud بإنشاء VPC تديره Google ووضع مثلك فيه. في هذه المقالة ، سنستخدم عنوان IP العام ، وهو الافتراضي. إنه عام بمعنى أن الأشخاص الذين تمت إضافة عناوين IP الخاصة بهم إلى القائمة البيضاء يمكنهم فقط الوصول إلى قاعدة البيانات.
لإدراج عنوان IP الخاص بك في القائمة البيضاء ، اكتب عنوان IP الخاص my ip
في بحث Google للحصول على عنوان IP الخاص بك. بعد ذلك ، انتقل إلى علامة التبويب "اتصالات" و "إضافة شبكة".
الاتصال بالمثيل
بعد ذلك ، انتقل إلى لوحة "نظرة عامة" واتصل باستخدام الغلاف السحابي.
ستتم كتابة أمر الاتصال بمثيل Cloud SQL مسبقًا في وحدة التحكم.
يمكنك استخدام إما المستخدم الجذر أو المستخدم الذي تم إنشاؤه في وقت سابق. في الأمر أدناه ، نقول: الاتصال بمثيل flask-demo
كمستخدم USERNAME
. سيُطلب منك إدخال كلمة مرور المستخدم.
gcloud sql connect flask-demo --user=USERNAME
إذا تلقيت خطأ يفيد بأنه ليس لديك معرّف مشروع ، فيمكنك الحصول على معرّف مشروعك عن طريق تشغيل هذا:
gcloud projects list
خذ معرف المشروع الذي تم إخراجه من الأمر أعلاه ، وأدخله في الأمر أدناه ، واستبدل PROJECT_ID
به.
gcloud config set project PROJECT_ID
بعد ذلك ، قم بتشغيل الأمر gcloud sql connect
، وسنكون متصلين.
قم بتشغيل هذا الأمر لرؤية قواعد البيانات النشطة:
> show databases;
تسمى قاعدة البيانات الخاصة بي db_demo
، وسأقوم بتشغيل الأمر أدناه لاستخدام قاعدة بيانات db_demo
. قد ترى بعض قواعد البيانات الأخرى ، مثل information_schema
و performance_schema
. هذه هناك لتخزين بيانات الجدول الوصفية.
> use db_demo;
بعد ذلك ، قم بإنشاء جدول يعكس القائمة من تطبيق Flask الخاص بنا. اكتب الرمز أدناه في المفكرة والصقه في غلاف السحابة الخاص بك:
create table songs( song_id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255), artist VARCHAR(255), genre VARCHAR(255), PRIMARY KEY(song_id) );
هذا الرمز هو أمر SQL يقوم بإنشاء جدول باسم songs
، بأربعة أعمدة ( song_id
، title
، artist
، genre
). لقد وجهنا أيضًا إلى أن الجدول يجب أن يعرّف song_id
أساسي ويزيد تلقائيًا من 1.
الآن ، قم بتشغيل show tables;
لتأكيد إنشاء الجدول.
وبهذه الطريقة ، أنشأنا قاعدة بيانات وجدول songs
.
مهمتنا التالية هي إعداد Google App Engine حتى نتمكن من نشر تطبيقنا.
محرك تطبيقات جوجل
App Engine عبارة عن نظام أساسي مُدار بالكامل لتطوير تطبيقات الويب واستضافتها على نطاق واسع. تتمثل ميزة النشر في App Engine في أنه يمكّن التطبيق من التوسع تلقائيًا لتلبية حركة المرور الواردة.
يقول موقع App Engine:
"مع عدم وجود إدارة للخادم وعمليات نشر التكوين الصفرية ، يمكن للمطورين التركيز فقط على إنشاء تطبيقات رائعة بدون نفقات الإدارة."
قم بإعداد App Engine
هناك عدة طرق لإعداد App Engine: من خلال واجهة المستخدم الخاصة بـ Google Cloud Console أو من خلال Google Cloud SDK. سنستخدم SDK لهذا القسم. يتيح لنا نشر مثيل Google Cloud وإدارته ومراقبته من أجهزتنا المحلية.
قم بتثبيت Google Cloud SDK
اتبع التعليمات لتنزيل وتثبيت SDK لنظام التشغيل Mac أو Windows. سيوضح لك الدليل أيضًا كيفية تهيئة SDK في CLI الخاص بك وكيفية اختيار مشروع Google Cloud.
الآن بعد أن تم تثبيت SDK ، سنقوم بتحديث برنامج Python النصي الخاص بنا ببيانات اعتماد قاعدة البيانات الخاصة بنا ونشره في App Engine.
الإعداد المحلي
في بيئتنا المحلية ، سنقوم بتحديث الإعداد ليناسب بنيتنا الجديدة ، والتي تتضمن Cloud SQL و App Engine.
أولاً ، أضف ملف app.yaml
إلى مجلد الجذر الخاص بنا. هذا هو ملف التكوين الذي يتطلبه App Engine لاستضافة وتشغيل تطبيقنا. يخبر App Engine بوقت التشغيل والمتغيرات الأخرى التي قد تكون مطلوبة. بالنسبة لتطبيقنا ، سنحتاج إلى إضافة بيانات اعتماد قاعدة البيانات الخاصة بنا كمتغيرات بيئة ، بحيث يكون App Engine على دراية بمثيل قاعدة البيانات الخاصة بنا.
في ملف app.yaml
، أضف المقتطف أدناه. ستكون قد حصلت على متغيرات وقت التشغيل وقاعدة البيانات من إعداد قاعدة البيانات. استبدل القيم باسم المستخدم وكلمة المرور واسم قاعدة البيانات واسم الاتصال الذي استخدمته عند إعداد Cloud SQL.
#app.yaml runtime: python37 env_variables: CLOUD_SQL_USERNAME: YOUR-DB-USERNAME CLOUD_SQL_PASSWORD: YOUR-DB-PASSWORD CLOUD_SQL_DATABASE_NAME: YOUR-DB-NAME CLOUD_SQL_CONNECTION_NAME: YOUR-CONN-NAME
الآن ، سنقوم بتثبيت PyMySQL. هذه حزمة Python MySQL التي تربط وتنفذ الاستعلامات على قاعدة بيانات MySQL. قم بتثبيت حزمة PyMySQL عن طريق تشغيل هذا الخط في CLI الخاص بك:
pip install pymysql
في هذه المرحلة ، نحن جاهزون لاستخدام PyMySQL للاتصال بقاعدة بيانات Cloud SQL من التطبيق. سيمكننا ذلك من الحصول على الاستفسارات وإدراجها في قاعدة البيانات الخاصة بنا.
تهيئة موصل قاعدة البيانات
أولاً ، قم بإنشاء ملف db.py
في المجلد الجذر الخاص بنا ، وأضف الكود أدناه:
#db.py import os import pymysql from flask import jsonify db_user = os.environ.get('CLOUD_SQL_USERNAME') db_password = os.environ.get('CLOUD_SQL_PASSWORD') db_name = os.environ.get('CLOUD_SQL_DATABASE_NAME') db_connection_name = os.environ.get('CLOUD_SQL_CONNECTION_NAME') def open_connection(): unix_socket = '/cloudsql/{}'.format(db_connection_name) try: if os.environ.get('GAE_ENV') == 'standard': conn = pymysql.connect(user=db_user, password=db_password, unix_socket=unix_socket, db=db_name, cursorclass=pymysql.cursors.DictCursor ) except pymysql.MySQLError as e: print(e) return conn def get_songs(): conn = open_connection() with conn.cursor() as cursor: result = cursor.execute('SELECT * FROM songs;') songs = cursor.fetchall() if result > 0: got_songs = jsonify(songs) else: got_songs = 'No Songs in DB' conn.close() return got_songs def add_songs(song): conn = open_connection() with conn.cursor() as cursor: cursor.execute('INSERT INTO songs (title, artist, genre) VALUES(%s, %s, %s)', (song["title"], song["artist"], song["genre"])) conn.commit() conn.close()
قمنا ببعض الأشياء هنا.
أولاً ، استرجعنا بيانات اعتماد قاعدة البيانات الخاصة بنا من ملف app.yaml
باستخدام طريقة os.environ.get
. App Engine قادر على جعل متغيرات البيئة المحددة في app.yaml
متاحة في التطبيق.
ثانيًا ، أنشأنا دالة open_connection
. إنه يتصل بقاعدة بيانات MySQL الخاصة بنا مع بيانات الاعتماد.
ثالثًا ، أضفنا وظيفتين: get_songs
و add_songs
. الأول يبدأ الاتصال بقاعدة البيانات عن طريق استدعاء وظيفة open_connection
. ثم يقوم بالاستعلام عن جدول songs
لكل صف ، وإذا كان فارغًا ، يتم إرجاع "No Songs in DB". تقوم وظيفة add_songs
بإدراج سجل جديد في جدول songs
.
أخيرًا ، نعود إلى حيث بدأنا ، ملف main.py
بنا. الآن ، بدلاً من الحصول على أغانينا من كائن ، كما فعلنا سابقًا ، نسمي وظيفة add_songs
لإدراج سجل ، ونطلق على وظيفة get_songs
لاسترداد التسجيلات من قاعدة البيانات.
لنقم main.py
:
#main.py from flask import Flask, jsonify, request from db import get_songs, add_songs app = Flask(__name__) @app.route('/', methods=['POST', 'GET']) def songs(): if request.method == 'POST': if not request.is_json: return jsonify({"msg": "Missing JSON in request"}), 400 add_songs(request.get_json()) return 'Song Added' return get_songs() if __name__ == '__main__': app.run()
قمنا باستيراد وظائف get_songs
و add_songs
في وظيفة عرض songs()
الخاصة بنا. إذا كنا بصدد تقديم طلب post
، فإننا نستدعي وظيفة add_songs
، وإذا كنا بصدد تقديم طلب get
، فإننا نسمي وظيفة get_songs
.
ويتم تطبيقنا.
التالي هو إضافة ملف requirements.txt
. يحتوي هذا الملف على قائمة الحزم اللازمة لتشغيل التطبيق. يتحقق App Engine من هذا الملف ويثبت الحزم المدرجة.
pip freeze | grep "Flask\|PyMySQL" > requirements.txt
يحصل هذا السطر على الحزمتين اللتين نستخدمهما للتطبيق (Flask و PyMySQL) ، ويقوم بإنشاء ملف requirements.txt
وإلحاق الحزم وإصداراتها بالملف.
في هذه المرحلة ، أضفنا ثلاثة ملفات جديدة: db.py
و app.yaml
و requirements.txt
.
انشر في Google App Engine
قم بتشغيل الأمر التالي لنشر تطبيقك:
gcloud app deploy
إذا سارت الأمور على ما يرام ، فستخرج وحدة التحكم الخاصة بك ما يلي:
تطبيقك يعمل الآن على App Engine. لرؤيتها في المتصفح ، قم بتشغيل gcloud app browse
في CLI الخاص بك.
يمكننا تشغيل Postman لاختبار post
get
الطلبات.
تطبيقنا مستضاف الآن على بنية Google الأساسية ، ويمكننا تعديل التكوين للحصول على جميع مزايا بنية بدون خادم. من الآن فصاعدًا ، يمكنك البناء على هذه المقالة لجعل تطبيقك الذي لا يحتوي على خادم أكثر قوة.
خاتمة
يؤدي استخدام البنية الأساسية للنظام الأساسي كخدمة (PaaS) مثل App Engine و Cloud SQL بشكل أساسي إلى التخلص من مستوى البنية التحتية وتمكيننا من البناء بشكل أسرع. بصفتنا مطورين ، لا داعي للقلق بشأن التكوين والنسخ الاحتياطي والاستعادة ونظام التشغيل والتحجيم التلقائي والجدران النارية وترحيل حركة المرور وما إلى ذلك. ومع ذلك ، إذا كنت بحاجة إلى التحكم في التكوين الأساسي ، فقد يكون من الأفضل استخدام خدمة مخصصة.
مراجع
- "تنزيل Python"
- "venv - إنشاء بيئات افتراضية" ، بايثون (وثائق)
- "تنزيل Postman"
- "Cloud SQL" ، Google Cloud
- جوجل كلاود
- "Google Cloud Free Tier" ، Google Cloud
- "إنشاء وإدارة المشاريع" ، جوجل كلاود
- "نظرة عامة على VPC" (السحابة الافتراضية الخاصة) ، Google Cloud
- "محرك التطبيقات" ، Google Cloud
- "Quickstarts" (تنزيل Google Cloud SDK) ، Google Cloud
- وثائق PyMySQL