يمكنك استهلاك واجهات برمجة التطبيقات البسيطة دون الحاجة إلى تكوين واجهة أمامية خارجية. تعرف على كيفية استخدام قوالب Django لاستهلاك واجهة برمجة التطبيقات.

عند استخدام تقنية الواجهة الخلفية أو إطار العمل مثل Django أو Laravel أو Node.js لكتابة واجهات برمجة تطبيقات REST، فإنك تحتاج إلى للحصول على مهارة أمامية إضافية باستخدام أطر عمل مثل React وAngular وVue لاستهلاك واجهة برمجة التطبيقات نقاط النهاية. ولكن هذا ليس هو الحال دائمًا، يمكنك استهلاك واجهات برمجة التطبيقات في Django نفسها باستخدام قوالب Django.

إعداد مشروع Django ونقاط نهاية API

ستكون الخطوة الأولى هي إنشاء دليل المشروع. افتح المحطة الطرفية الخاصة بك وقم بإنشاء دليل لمشروعك.

mkdir payment_wallet_project
cd payment_wallet_project

في هذا البرنامج التعليمي، ستقوم ببناء واجهات برمجة التطبيقات (APIs) لمحفظة الدفع.

كود المصدر الكامل متاح في مستودع جيثب.

ابدأ ب خلق بيئة افتراضية. في هذه الحالة، سوف تستخدم مكتبة Pipenv.

pipenv install django djangorestframework

يقوم هذا الأمر بتثبيت المكتبات الضرورية وكذلك إنشاء بيئة افتراضية.

قم بتنشيط البيئة الافتراضية باستخدام الأمر أدناه:

instagram viewer
pipenv shell

إنشاء مشروع جانغو جديد اسم الشيئ PayApp.

django-admin startproject PayApp .

باستخدام النقطة الكاملة (.) عند نهاية ال django-admin يضمن الأمر أن المشروع يتجنب إنشاء دليل مكرر لدليل المشروع.

إنشاء تطبيق جانغو الجديد ضمن دليل المشروع.

python manage.py startapp wallet

الآن، تابع إنشاء تطبيق API الخاص بك باستخدام الخطوات الموضحة أدناه.

إنشاء واجهة برمجة تطبيقات محفظة الدفع REST

افتح ال Wallet/models.py ملف وتعريف المحفظة ونماذج المعاملات.

from django.db import models

classWallet(models.Model):
user = models.CharField(max_length=100)
balance = models.DecimalField(max_digits=10, decimal_places=2)
date_created = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)

def__str__(self):
return self.user

classTransaction(models.Model):
wallet = models.ForeignKey(Wallet, on_delete=models.CASCADE)
amount = models.DecimalField(max_digits=10, decimal_places=2)
timestamp = models.DateTimeField(auto_now_add=True)

في ال محفظة الدليل، قم بإنشاء ملف جديد serializers.py، واكتب متسلسلات المحفظة ونموذج المعاملة.

from rest_framework import serializers
from .models import Wallet, Transaction

classWalletSerializer(serializers.ModelSerializer):
classMeta:
model = Wallet
fields = '__all__'
classTransactionSerializer(serializers.ModelSerializer):
classMeta:
model = Transaction
fields = '__all__'

يأخذ المُسلسل في الاعتبار جميع الحقول الموجودة في المحفظة ونماذج المعاملات.

في Wallet/views.py، اكتب وجهات النظر للتعامل مع منطق تنفيذ وظيفة المحفظة. وهذا يشمل قدرات الإيداع والسحب.

from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.decorators import action
from decimal import Decimal
from .models import Wallet, Transaction
from .serializers import WalletSerializer, TransactionSerializer

classWalletViewSet(viewsets.ModelViewSet):
queryset = Wallet.objects.all()
serializer_class = WalletSerializer

@action(detail=True, methods=['post'])
defdeposit(self, request, pk=None):
wallet = self.get_object()
amount = Decimal(request.data['amount'])
wallet.balance += amount
wallet.save()
serializer = WalletSerializer(wallet)
return Response(serializer.data)

@action(detail=True, methods=['post'])
defwithdraw(self, request, pk=None):
wallet = self.get_object()
amount = Decimal(request.data['amount'])
if wallet.balance < amount:
return Response({'error': 'Insufficient funds'},
status=status.HTTP_400_BAD_REQUEST)
wallet.balance -= amount
wallet.save()
serializer = WalletSerializer(wallet)
return Response(serializer.data)'

classTransactionViewSet(viewsets.ModelViewSet):
queryset = Transaction.objects.all()
Serializer_class = TransactionSerializer

بعد ذلك، حدد توجيه URL لواجهة برمجة التطبيقات (API) عن طريق إنشاء ملف Wallet/urls.py ملف:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import WalletViewSet, TransactionViewSet, wallet_view

router = DefaultRouter()
router.register(r'wallets', WalletViewSet, basename='wallets')
router.register(r'transactions', TransactionViewSet, basename='transactions')

urlpatterns = [
path('api/', include(router.urls)),
path('wallets//deposit/', WalletViewSet.as_view({'post': 'deposit'}),
name='wallet-deposit'),
path('wallets//withdraw/', WalletViewSet.as_view({'post': 'withdraw'}),
name='wallet-withdraw'),

]

في مشروعك urls.py، قم بتضمين عناوين URL الخاصة بالتطبيق:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('wallet.urls')),
]

في ال PayApp/settings.py الملف، أضف محفظة و تطبيقات Rest_framework إلى INSTALLED_APPS قائمة.

INSTALLED_APPS = [

"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",

"rest_framework", # new
"wallet", # new

]

سيؤدي هذا إلى تسجيل تطبيقات المحفظة وrest_framework في تطبيق مشروع Django.

استهلاك واجهة برمجة التطبيقات باستخدام قوالب جانغو

الآن، ستستخدم قوالب Django لإنشاء واجهة أمامية بسيطة لاستهلاك واجهة برمجة التطبيقات. إنشاء Wallet.html الملف في المحفظة/القوالب/ الدليل وأضف كود HTML أدناه.


"en">

"UTF-8">
"viewport" content="width=device-width, initial-scale=1">
Wallet
"stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/
css/bootstrap.min.css">


class="container">

Wallets


class="table">














User Balance Actions
{{ wallet.user }} "balance">{{ wallet.balance }}
"loading-indicator"class="d-none">
class="spinner-bordertext-primary" role="status">
class="sr-only">Loading...span>

Please wait while the deposit is being processed.



"deposit-form" method="post">
{% csrf_token %}
"number" name="amount" step="0.01" min="0" required>

"post" id="withdraw-form">
{% csrf_token %}
"number" name="amount" step="0.01" min="0" required>



يعرض ملف HTML واجهات برمجة التطبيقات للإيداع والسحب في واجهة مستخدم جميلة مصممة باستخدام Bootstrap.

تفاعل المستخدم مع النماذج

في ملف HTML، أنشئ علامة برنامج نصي وأضف التعليمة البرمجية التالية إلى مستمع حدث إرسال نموذج الإيداع.

بعد ذلك، أضف مستمع الحدث لإرسال نموذج السحب باستخدام الكود أدناه:

مستمع الحدث هو المسؤول عن التعامل مع الإيداع والسحب (# نموذج الإيداع و #نموذج السحب) نماذج التقديم.

عنوان URL لطلب الجلب مخصص لمطابقة عناوين URL لإجراءات الإيداع والسحب.

يتم بعد ذلك تحليل استجابات JSON لعمليات الإيداع والسحب للحصول على الرصيد المحدث (data.balance). ثم يتم تنسيقها وعرضها على الصفحة.

التالي، في Wallet/views.py، أضف التحديث التالي لعرض صفحة Wallet.html:

from django.shortcuts import render

defwallet_view(request):
# Retrieve the wallet to display
wallet = Wallet.objects.first()
return render(request, 'wallet.html', {'wallet': wallet})

في هذا المثال، سوف تستخدم أولاً() طريقة الاستعلام لتحديد محفظة مستخدم واحد لأغراض العرض التوضيحي.

تحديث urls.py الملف عن طريق إضافة مسار إلى Wallet_view على النحو التالي:

from .views import wallet_view

urlpatterns = [
...
path('home/', wallet_view, name='wallet-page'),
]

قم بالوصول إلى صفحة المحفظة من عنوان URL: http://127.0.0.1:8000/home/.

مع إعداد كل شيء وتشغيله كما هو متوقع، قم بتنفيذ الأمر com.makemigrations و يهاجر الأوامر. وأخيراً قم بتشغيل التطبيق:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

للوصول إلى نقاط نهاية API، انتقل إلى http://127.0.0.1:8000/api/.

الناتج المتوقع:

انتقل إلى مضيف محلي للتفاعل مع المحفظة.

الناتج المتوقع:

تُظهر المحفظة الرصيد وتمنحك خيار الإيداع أو السحب.

فهم قوالب جانغو ودورها في استهلاك API

على الرغم من كونها ممتازة لتقديم محتوى ثابت، إلا أن قوالب Django لها قيود معينة عند استخدام واجهات برمجة التطبيقات:

  • مرونة محدودة: قوالب Django أقل مرونة من تلك التي تم إنشاؤها باستخدام Jinja2 أو Twig حيث يتم استخدامها لعرض بنيات محددة. على سبيل المثال، سيتعين عليك تحليل JSON يدويًا وإدراج البيانات في القالب إذا كنت بحاجة إلى استهلاك واجهة برمجة التطبيقات (API) التي أعادت بيانات JSON. قد يكون هذا أمرًا صعبًا، خاصةً إذا كانت واجهة برمجة التطبيقات (API) توفر هياكل بيانات معقدة.
  • لا يوجد دعم للطلبات غير المتزامنة: تفتقر قوالب Django أصلاً إلى القدرة على التعامل مع الطلبات غير المتزامنة. لا تزال القوالب بحاجة إلى معالجة متزامنة على الرغم من أن أطر الويب المعاصرة غير المتزامنة/المنتظرة مثل Flask وDjango تدعم بناء الجملة. هذا يعني أنه سيتعين عليك الانتظار حتى تنتهي جميع الطلبات قبل إنتاج القالب إذا كنت بحاجة إلى الحصول على بيانات من مصادر عديدة قبل عرض الصفحة.
  • معالجة محدودة للأخطاء: قد تحدث أخطاء بانتظام عند استخدام واجهات برمجة التطبيقات. لا توجد آليات مدمجة لمعالجة الأخطاء بشكل أنيق في قوالب جانغو. ستحتاج إلى اكتشاف الاستثناء وإدارته داخل القالب نفسه في حالة فشل استدعاء واجهة برمجة التطبيقات (API)، مما قد يؤدي إلى تعليمات برمجية خرقاء وصعبة الصيانة.

بناء تطبيقات قابلة للتطوير

من خلال توفير طريقة لفصل طبقة العرض التقديمي عن منطق الأعمال، تسمح قوالب Django للمطورين بالتركيز على إنشاء تعليمات برمجية قابلة لإعادة الاستخدام وقابلة للصيانة. ومع ذلك، نظرًا للقيود الخاصة بها، قد لا تكون قوالب Django هي الخيار الأفضل عند استخدام واجهات برمجة التطبيقات على نطاق واسع. لا تزال أطر عمل العميل مثل React مفيدة في إنشاء تطبيقات قابلة للتطوير.