الواجهة الأمامية والخلفية
لنبدأ بالترتيب. ما هي الواجهة الأمامية والخلفية؟ الموقع له وجهان: أمامي وداخلي على التوالي. يكون الأول مسؤولاً عادةً عن الترتيب المرئي للكائنات على الصفحة (أين الصور ، وأين النص ، وأين الأزرار). والثاني مسؤول عن "الأفعال". عادة ما تكون هذه نقرات على نفس الأزرار أو على "أشياء" أخرى بالموقع. على سبيل المثال ، تذهب إلى صفحة شبكتك الاجتماعية المفضلة وتحتاج أولاً إلى تسجيل الدخول إلى حسابك. على الجانب الأمامي (الواجهة الأمامية) ، تقوم بإدخال اسم المستخدم وكلمة المرور الخاصة بك والنقر فوق الزر "تسجيل الدخول". في هذا الوقت ، يتم إرسال الطلب إلى قاعدة البيانات للتحقق من وجود مثل هذا المستخدم ، وفي حالة نجاحه ، سيتم نقلك إلى شبكة التواصل الاجتماعي ضمن حسابك ، وإلا ستظهر لك رسالة خطأ. في هذه الحالة ، تكون الواجهة الخلفية مسؤولة بشكل أساسي عن إرسال الطلب إلى قاعدة البيانات.تنقسم عادة إلى ثلاثة أجزاء فرعية:
- واجهة برمجة تطبيقات الويب لقبول الطلبات
- منطق الأعمال لمعالجة الطلبات
- التفاعل مع قاعدة البيانات
في هذه المقالة ، سنتحدث بشكل أساسي عن واجهة برمجة التطبيقات أو واجهة برمجة التطبيقات وقليلًا عن منطق الأعمال. لكن أولاً ، لنقم بإنشاء خادم.
إنشاء الخادم الخاص بك
هذه هي الطريقة التي يبدو بها أبسط تطبيق لخادم Python باستخدام إطار عمل flask:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, World!"
app.run()
يوجد بالفعل مسار واحد فارغ ("/") وإذا قمت بتشغيل هذا التطبيق وفتح المتصفح على الصفحة 127.0.0.1 : 5000 ، فسترى النقش "Hello، World!". من جانب الخادم ، سترى الرسالة التالية:
127.0.0.1 - - [07 / Aug / 2020 20:32:16] "GET / HTTP / 1.1" 200 - وهكذا بالذهاب إلى هذا الرابط في المتصفح (العميل) ، فإننا طلب GET إلى خادمنا وندخل في وظيفة الفهرس - من هنا يتم أخذ "Hello، World!". يمكنك إضافة استعلامات أخرى (أكثر تعقيدًا) عبر مسارات أخرى (أو ليس بالضرورة). كما قلت ، في هذه الحالة ، استخدمنا طلب GET - الافتراضي القياسي. ولكن هناك العديد من الأشياء الأخرى ، وأشهرها POST ، PUT ، DELETE. لكن لماذا هذا ضروري؟
إنشاء قراءة تحديث حذف
أولاً ، يشير REST إلى REpresentational State Transfer (أو بطريقة أبسط ، REpresentational State Transfer). في الواقع ، لا يعد تعريف REST في حد ذاته أمرًا مهمًا ، ولكنه يرتبط عادةً باختصار آخر - CRUD - إنشاء قراءة تحديث حذف. في البداية ، قدمت مثالًا متعلقًا بقاعدة بيانات وهذه العمليات الأربع جزء لا يتجزأ من العمل معها (جيدًا ، أو مع البيانات فقط).
ثانيًا ، يجب أن تدعم واجهة برمجة تطبيقات REST أو RESTfull معالجة هذه الإجراءات الأربعة. هذا هو المكان الذي تكون فيه طرق GET و POST و PUT و DELETE مفيدة. كقاعدة (ليس بالضرورة!) يتم استخدام طريقة POST لإضافة بيانات جديدة (إنشاء) ، GET - للقراءة (للقراءة) ، PUT - لتحديث البيانات الموجودة (تحديث) و DELETE ، على التوالي ، لحذف (حذف). على سبيل المثال ، يمكن إعادة تصميم تطبيق القارورة نفسه كما يلي:
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=["POST", "GET", "PUT", "DELETE"])
def index():
if request.method == "POST":
#
if request.method == "GET":
#
if request.method == "PUT":
#
if request.method == "DELETE":
#
app.run()
هذه هي واجهة برمجة تطبيقات REST البدائية. يمكن لواجهة الواجهة الآن إرسال الطلبات ، وسنتخذ إجراءات أخرى بناءً على نوعها.
العمل مع البيانات
تطبيقنا الحالي ليس مثيرًا للاهتمام على الإطلاق - سيكون من الجيد العمل مع بعض البيانات. للقيام بذلك ، عليك التفكير في كيفية نقلها. الطريقة الأكثر شيوعًا هي تنسيق JSON (ولكن يمكنك استخدام الآخرين ، على سبيل المثال ، XML). إنه مشابه لقاموس بيثون وهو سهل الاستخدام للغاية. سأستخدم البيانات الأولية كمثال مع إذن على شبكة اجتماعية:
data = {
1: {
"login": "login1",
"password": "Qwerty1"},
2: {
"login": "login2",
"password": "Ytrewq2"}
}
لدينا بيانات ، يوجد فيها مستخدمان حتى الآن (تسجيل الدخول 1 وتسجيل الدخول 2) وسنعمل على CRUD هذا التاريخ. يجب أن يقال أن جميع الطرق الأربعة نادرًا ما تعمل على نفس المسار وعادةً ما تفعل ذلك: بالنسبة لطرق GET (إرجاع جميع المستخدمين) و POST ، يتم استخدام المسار ، على سبيل المثال ، "/ المستخدمون" ، ولطرق GET (أعط مستخدم واحد معرفه) ، ضع وحذف "/ المستخدمين / معرف". وتجدر الإشارة أيضًا إلى أنه لتحديث وإنشاء مستخدمين جدد ، نتلقى بيانات عنهم في نص الطلب (request.json). الآن يمكن إعادة كتابة برنامجنا على النحو التالي:
from flask import Flask, request
app = Flask(__name__)
data = {
1: {
"login": "login1",
"password": "Qwerty1"},
2: {
"login": "login2",
"password": "Ytrewq2"}
}
@app.route("/users", methods=["POST", "GET"])
def work_with_users():
if request.method == "POST":
data[max(data.keys())+1] = request.json
return {"message": "User was created"}, 201
if request.method == "GET":
return data, 200
@app.route("/users/<int:user_id>", methods=["GET", "PUT", "DELETE"])
def work_with_user_by_id(user_id):
if request.method == "GET":
return data[user_id], 200
if request.method == "PUT":
data[user_id]["login"] = request.json["login"]
data[user_id]["password"] = request.json["password"]
return {"message": "User was updated"}, 200
if request.method == "DELETE":
data.pop(user_id)
return {"message": "User was deleted"}, 200
app.run()
هناك العديد من البرامج لاختبار الطلبات (Postman ، Fiddler ، Insomnia ...) وأوصيك بالتعرف على أحدها (شخصيًا ، Postman هو المفضل لدي). بمساعدتهم ، يمكنك معرفة ما يأتي نتيجة الطلب وما هو رمز الحالة (الأرقام 200/201 في المقابل). ويمكنك أيضًا إرسال البيانات على مراحل عن طريق إضافتها إلى نص الطلب.
تجدر الإشارة أيضًا إلى أن هذا النهج غير مستخدم حاليًا ، وعادة ما يتم استخدام مكتبة flask-restplus (أو flask-restx التي حلت محلها) ، لكنني أعتقد أنه عليك أولاً التعرف على القارورة النقية. من الضروري أيضًا التحقق من وجود البيانات وصحتها وتوفير إعادة الخطأ في الحالات المعاكسة.
خاتمة
REST APIs هي ببساطة طرق CRUD التي يتم الوصول إليها من قبل جانب العميل في الموقع عبر مسارات محددة. عن طريق الأذن والنظرة ، قد يكون من الصعب إدراك ذلك ، لذلك أوصي بكتابة الخادم الخاص بك عن طريق القياس مع المثال. أنا شخصياً أجد flask واحدًا من أسهل الأطر لهذا ، وإذا كنت مبتدئًا ، فأنا أنصحك بتجربته.