Μπορείτε να καταναλώνετε αβίαστα απλά API χωρίς να χρειάζεται να διαμορφώσετε μια εξωτερική διεπαφή. Μάθετε πώς να χρησιμοποιείτε πρότυπα Django για κατανάλωση API.

Όταν χρησιμοποιείτε μια τεχνολογία υποστήριξης ή πλαίσιο όπως το Django, το Laravel ή το Node.js για τη σύνταξη REST API, χρειάζεστε να έχετε μια πρόσθετη δεξιότητα frontend χρησιμοποιώντας πλαίσια όπως React, Angular και Vue για να καταναλώσετε το API καταληκτικά σημεία. Αλλά αυτό δεν συμβαίνει πάντα, μπορείτε να καταναλώσετε τα API στο ίδιο το Django χρησιμοποιώντας πρότυπα Django.

Ρύθμιση ενός έργου Django και τελικών σημείων API

Το πρώτο βήμα θα είναι η δημιουργία ενός καταλόγου έργου. Ανοίξτε το τερματικό σας και δημιουργήστε έναν κατάλογο για το έργο σας.

mkdir payment_wallet_project
cd payment_wallet_project

Για αυτό το σεμινάριο, θα δημιουργήσετε API για ένα πορτοφόλι πληρωμών.

Ο πλήρης πηγαίος κώδικας είναι διαθέσιμος σε α Αποθετήριο GitHub.

Ξεκινήστε από δημιουργώντας ένα εικονικό περιβάλλον. Σε αυτήν την περίπτωση, θα χρησιμοποιήσετε τη βιβλιοθήκη Pipenv.

instagram viewer
pipenv install django djangorestframework

Αυτή η εντολή εγκαθιστά τις απαραίτητες βιβλιοθήκες καθώς και δημιουργεί ένα εικονικό περιβάλλον.

Ενεργοποιήστε το εικονικό περιβάλλον χρησιμοποιώντας την παρακάτω εντολή:

pipenv shell

Δημιουργήστε ένα νέο έργο Django ονομάστηκε PayApp.

django-admin startproject PayApp .

Χρησιμοποιώντας την τελεία (.) στο τέλος του django-διαχειρ Η εντολή διασφαλίζει ότι το έργο αποφεύγει τη δημιουργία ενός διπλότυπου καταλόγου του καταλόγου του έργου.

Δημιουργώ ένα νέα εφαρμογή Django στον κατάλογο του έργου.

python manage.py startapp wallet

Τώρα, προχωρήστε στη δημιουργία της εφαρμογής API χρησιμοποιώντας τα παρακάτω βήματα.

Δημιουργία API REST Πορτοφολιού πληρωμών

Ανοιξε το πορτοφόλι/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__'

Οι σειριοποιητές λαμβάνουν υπόψη όλα τα πεδία στα μοντέλα πορτοφολιού και συναλλαγών.

Σε πορτοφόλι/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 δημιουργώντας ένα πορτοφόλι/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_framwork στο 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, δημιουργήστε μια ετικέτα σεναρίου και προσθέστε τον ακόλουθο κώδικα στο πρόγραμμα ακρόασης συμβάντων υποβολής φόρμας κατάθεσης.

Στη συνέχεια, προσθέστε το πρόγραμμα ακρόασης συμβάντος για την υποβολή της φόρμας ανάληψης χρησιμοποιώντας τον παρακάτω κώδικα:

Ο ακροατής του συμβάντος είναι υπεύθυνος για τη διαχείριση της κατάθεσης και της ανάληψης (#κατάθεση-φόρμα και #withdraw-form) φόρμα υποβολής.

Η διεύθυνση URL για το αίτημα ανάκτησης προορίζεται για αντιστοίχιση των διευθύνσεων URL για ενέργειες κατάθεσης και ανάληψης.

Στη συνέχεια, οι απαντήσεις JSON για τις καταθέσεις και τις αναλήψεις αναλύονται για να ληφθεί το ενημερωμένο υπόλοιπο (στοιχεία.υπόλοιπο). Στη συνέχεια μορφοποιούνται και εμφανίζονται στη σελίδα.

Στη συνέχεια, στο πορτοφόλι/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/.

Όταν όλα έχουν ρυθμιστεί και λειτουργούν όπως αναμένεται, εκτελέστε το μεταναστεύσεις και αποδημώ εντολές. Τέλος, εκτελέστε την εφαρμογή:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

Για πρόσβαση στα τελικά σημεία του API, μεταβείτε στο http://127.0.0.1:8000/api/.

Αναμενόμενη έξοδος:

Πλοηγηθείτε στο localhost για αλληλεπίδραση με το πορτοφόλι.

Αναμενόμενη έξοδος:

Το πορτοφόλι δείχνει το υπόλοιπο και σας δίνει την επιλογή είτε να κάνετε κατάθεση είτε να κάνετε ανάληψη.

Κατανόηση των προτύπων Django και του ρόλου τους στην κατανάλωση API

Παρά το γεγονός ότι είναι εξαιρετικά για την παρουσίαση στατικού περιεχομένου, τα πρότυπα Django έχουν ορισμένους περιορισμούς όταν χρησιμοποιούν API:

  • Περιορισμένη ευελιξία: Τα πρότυπα Django είναι λιγότερο ευέλικτα από αυτά που δημιουργήθηκαν με τη χρήση Jinja2 ή Twig, καθώς χρησιμοποιούνται για την εμφάνιση καθορισμένων δομών. Για παράδειγμα, θα έπρεπε να αναλύσετε με μη αυτόματο τρόπο το JSON και να εισαγάγετε τα δεδομένα στο πρότυπο, εάν χρειαστεί να καταναλώσετε ένα API που επέστρεφε δεδομένα JSON. Αυτό μπορεί να είναι δύσκολο, κυρίως εάν το API παρέχει περίπλοκες δομές δεδομένων.
  • Δεν υπάρχει υποστήριξη για ασύγχρονα αιτήματα: Τα πρότυπα Django στερούνται εγγενώς τη δυνατότητα χειρισμού ασύγχρονων αιτημάτων. Τα πρότυπα εξακολουθούν να χρειάζονται σύγχρονη επεξεργασία, παρόλο που τα σύγχρονα πλαίσια web async/wait, όπως το Flask και το Django, υποστηρίζουν σύνταξη. Αυτό σημαίνει ότι θα πρέπει να περιμένετε να ολοκληρωθούν όλα τα αιτήματα πριν δημιουργήσετε το πρότυπο, εάν χρειαστεί να αποκτήσετε δεδομένα από πολλές πηγές πριν αποδώσετε μια σελίδα.
  • Περιορισμένος χειρισμός σφαλμάτων: Ενδέχεται να εμφανίζονται τακτικά σφάλματα κατά τη χρήση API. Δεν υπάρχουν ενσωματωμένοι μηχανισμοί για χαριτωμένο χειρισμό σφαλμάτων στα πρότυπα Django. Θα χρειαστεί να συλλάβετε την εξαίρεση και να τη διαχειριστείτε μέσα στο ίδιο το πρότυπο, εάν αποτύχει μια κλήση API, κάτι που θα μπορούσε να οδηγήσει σε αδέξιο και δύσκολο στη διατήρηση κώδικα.

Δημιουργία κλιμακούμενων εφαρμογών

Παρέχοντας έναν τρόπο διαχωρισμού του επιπέδου παρουσίασης από την επιχειρηματική λογική, τα πρότυπα Django επιτρέπουν στους προγραμματιστές να επικεντρωθούν στη δημιουργία επαναχρησιμοποιήσιμου και διατηρήσιμου κώδικα. Ωστόσο, λόγω των περιορισμών τους, τα πρότυπα Django ενδέχεται να μην είναι η καλύτερη επιλογή όταν καταναλώνετε API σε κλίμακα. Τα πλαίσια πελατών όπως το React εξακολουθούν να είναι χρήσιμα για τη δημιουργία κλιμακούμενων εφαρμογών.