אתה יכול ללא מאמץ לצרוך ממשקי API פשוטים ללא צורך להגדיר חזית חיצונית. למד כיצד להשתמש בתבניות Django לצריכת API.

בעת שימוש בטכנולוגיית קצה או מסגרת עורפית כמו Django, Laravel או Node.js כדי לכתוב ממשקי API של REST, אתה צריך לקבל מיומנות חזיתית נוספת באמצעות מסגרות כמו React, Angular ו-Vue כדי לצרוך את ה-API נקודות קצה. אבל זה לא תמיד המקרה, אתה יכול לצרוך את ממשקי ה-API ב-Django עצמו באמצעות תבניות Django.

הגדרת פרויקט Django ונקודות קצה של API

השלב הראשון יהיה יצירת ספריית פרויקט. פתח את המסוף שלך וצור ספרייה עבור הפרויקט שלך.

mkdir payment_wallet_project
cd payment_wallet_project

עבור הדרכה זו, תבנה ממשקי API עבור ארנק תשלום.

קוד המקור המלא זמין ב-a מאגר GitHub.

התחל ב יצירת סביבה וירטואלית. במקרה זה, תשתמש בספריית Pipenv.

pipenv install django djangorestframework

פקודה זו מתקינה את הספריות הדרושות וכן יוצרת סביבה וירטואלית.

הפעל את הסביבה הוירטואלית באמצעות הפקודה למטה:

pipenv shell

צור פרויקט Django חדש בשם PayApp.

django-admin startproject PayApp .

שימוש בנקודה (.) בסוף ה django-admin הפקודה מבטיחה שהפרויקט ימנע מיצירת ספרייה כפולה של ספריית הפרויקט.

instagram viewer

ליצור אפליקציית Django חדשה בתוך ספריית הפרויקט.

python manage.py startapp wallet

כעת, המשך לבנות את יישום ה-API שלך באמצעות השלבים הבאים.

יצירת REST API של ארנק תשלום

פתח את ה 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

לאחר מכן, הגדר את ניתוב כתובת האתר עבור ה-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, כלול את כתובות האתרים של האפליקציה:

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_framwork apps אל ה 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.

צריכת ה-API עם תבניות Django

כעת, תשתמש בתבניות Django כדי ליצור ממשק קצה פשוט לצריכת ה-API. ליצור 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 מציג את ממשקי ה-API של ההפקדה והמשיכה בממשק משתמש יפהפה שעוצב באמצעות Bootstrap.

אינטראקציה של משתמשים עם טפסים

בקובץ ה-HTML, צור תג סקריפט והוסף את הקוד הבא למאזין האירועים להגשת טופס ההפקדה.

לאחר מכן, הוסף את מאזין האירועים להגשת טופס המשיכה באמצעות הקוד שלהלן:

מאזין האירוע אחראי לטיפול בהפקדה ובמשיכה (#טופס הפקדה ו טופס #משיכה) הגשת טופס.

כתובת האתר של בקשת האחזור מיועדת להתאמת כתובות האתרים לפעולות הפקדה ומשיכה.

תגובות ה-JSON עבור ההפקדות והמשיכות מנותחות לאחר מכן כדי לקבל את היתרה המעודכנת (איזון נתונים). לאחר מכן הם מעוצבים ומוצגים בדף.

לאחר מכן, ב- 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'),
]

גש לדף הארנק מכתובת האתר: http://127.0.0.1:8000/home/.

כשהכל מוגדר ועובד כמצופה, בצע את ה הגירות ו להגר פקודות. לבסוף, הפעל את האפליקציה:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

כדי לגשת לנקודות הקצה של ה-API, נווט אל http://127.0.0.1:8000/api/.

פלט צפוי:

נווט אל מארח מקומי לאינטראקציה עם הארנק.

פלט צפוי:

הארנק מציג את היתרה ונותן לך אפשרות להפקיד או למשוך.

הבנת תבניות Django ותפקידן בצריכת API

למרות היותם מצוינים להצגת תוכן סטטי, לתבניות Django יש הגבלות מסוימות בעת שימוש בממשקי API:

  • גמישות מוגבלת: תבניות Django פחות גמישות מאלו שנוצרו באמצעות Jinja2 או Twig מאחר שהן משמשות להצגת מבנים שצוינו. לדוגמה, תצטרך לנתח באופן ידני את ה-JSON ולהכניס את הנתונים לתבנית אם תצטרך לצרוך API שהחזיר נתוני JSON. זה יכול להיות מאתגר, בעיקר אם ה-API מספק מבני נתונים מורכבים.
  • אין תמיכה בבקשות אסינכרוניות: תבניות Django חסרות באופן טבעי את היכולת לטפל בבקשות אסינכרוניות. תבניות עדיין זקוקות לעיבוד סינכרוני למרות שהמסגרות האינטרנטיות העכשוויות אסינכרון/ממתינות כמו Flask ו-Django תומכות בתחביר. משמעות הדבר היא שתצטרך לחכות לסיום כל הבקשות לפני הפקת התבנית אם תצטרך לרכוש נתונים ממקורות רבים לפני עיבוד דף.
  • טיפול בשגיאות מוגבל: שגיאות עשויות להתרחש באופן קבוע בעת שימוש בממשקי API. אין מנגנונים מובנים לטיפול בשגיאות חינני בתבניות Django. תצטרך לתפוס את החריג ולנהל אותו בתוך התבנית עצמה אם קריאת API נכשלת, מה שעלול לגרום לקוד מגושם ומאתגר לתחזוקה.

בניית יישומים ניתנים להרחבה

על ידי מתן דרך להפריד את שכבת המצגת מההיגיון העסקי, תבניות Django מאפשרות למפתחים להתמקד ביצירת קוד לשימוש חוזר וניתן לתחזוקה. עם זאת, בשל מגבלותיהן, ייתכן שתבניות Django אינן הבחירה הטובה ביותר בעת צריכת ממשקי API בקנה מידה. מסגרות לקוח כמו React עדיין שימושיות בבניית יישומים ניתנים להרחבה.