Možete bez napora koristiti jednostavne API-je bez potrebe za konfiguriranjem vanjskog sučelja. Naučite kako koristiti Django predloške za upotrebu API-ja.

Kada koristite pozadinsku tehnologiju ili okvir kao što su Django, Laravel ili Node.js za pisanje REST API-ja, trebate imati dodatnu vještinu sučelja koristeći okvire kao što su React, Angular i Vue za korištenje API-ja krajnje točke. Ali to nije uvijek slučaj, možete koristiti API-je u samom Djangu koristeći Django predloške.

Postavljanje Django projekta i API krajnjih točaka

Prvi korak bit će stvaranje imenika projekta. Otvorite svoj terminal i stvorite direktorij za svoj projekt.

mkdir payment_wallet_project
cd payment_wallet_project

U ovom vodiču izgradit ćete API-je za novčanik za plaćanje.

Puni izvorni kod dostupan je u a GitHub spremište.

Počni od stvaranje virtualnog okruženja. U ovom slučaju, koristit ćete biblioteku Pipenv.

pipenv install django djangorestframework

Ova naredba instalira potrebne biblioteke, kao i stvara virtualno okruženje.

instagram viewer

Aktivirajte virtualno okruženje pomoću donje naredbe:

pipenv shell

Napravite novi Django projekt imenovani PayApp.

django-admin startproject PayApp .

Upotreba točke (.) na kraju django-admin naredba osigurava da projekt izbjegava stvaranje duplikata direktorija projektnog direktorija.

Stvoriti nova aplikacija Django unutar imenika projekta.

python manage.py startapp wallet

Sada nastavite s izgradnjom svoje API aplikacije pomoću koraka u nastavku.

Stvaranje REST API-ja novčanika za plaćanje

Otvori novčanik/modeli.py arhivirati i definirati novčanik i modele transakcija.

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)

u novčanik imenik, stvorite novu datoteku serijalizatori.pyi napišite serijalizatore modela novčanika i transakcije.

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__'

Serializatori uzimaju u obzir sva polja u modelima novčanika i transakcija.

U wallet/views.py, napišite poglede za rukovanje logikom implementacije funkcionalnosti novčanika. To uključuje mogućnosti polaganja i povlačenja.

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

Zatim definirajte URL usmjeravanje za API stvaranjem novčanik/urls.py datoteka:

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'),

]

U vašem projektu urls.py, uključuju URL-ove aplikacije:

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

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

u PayApp/settings.py datoteku, dodajte novčanik i rest_framwork aplikacije prema INSTALLED_APPS popis.

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

]

Ovo će registrirati aplikacije wallet i rest_framework u aplikaciji Django projekta.

Korištenje API-ja s Django predlošcima

Sada ćete koristiti Django predloške za stvaranje jednostavnog sučelja za korištenje API-ja. Stvoriti novčanik.html datoteka u novčanik/predlošci/ imenik i dodajte donji HTML kod.


"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 datoteka prikazuje API-je za polog i isplatu u prekrasnom korisničkom sučelju dizajniranom pomoću Bootstrapa.

Korisnička interakcija s obrascima

U HTML datoteci stvorite oznaku skripte i dodajte sljedeći kod slušatelju događaja podnošenja obrasca za depozit.

Zatim dodajte slušatelja događaja za podnošenje obrasca za povlačenje pomoću donjeg koda:

Slušatelj događaja odgovoran je za rukovanje uplatama i isplatama (#depozitni obrazac i #povlačenje-obrazac) podnošenje obrazaca.

URL za zahtjev za dohvaćanje služi za podudaranje URL-ova za radnje uplate i isplate.

JSON odgovori za uplate i isplate zatim se analiziraju da bi se dobio ažurirani saldo (podaci.ravnoteža). Zatim se formatiraju i prikazuju na stranici.

Dalje, u wallet/views.py, dodajte sljedeće ažuriranje za prikaz stranice 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})

U ovom primjeru upotrijebit ćete prvi() metoda upita za odabir novčanika jednog korisnika u demonstracijske svrhe.

Ažurirajte urls.py datoteku dodavanjem staze u wallet_view kako slijedi:

from .views import wallet_view

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

Pristupite stranici novčanika s URL-a: http://127.0.0.1:8000/home/.

Nakon što je sve postavljeno i radi prema očekivanjima, izvršite napravitimigracije i migrirati naredbe. Na kraju pokrenite aplikaciju:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

Za pristup krajnjim točkama API-ja idite na http://127.0.0.1:8000/api/.

Očekivani rezultat:

Idite do lokalni domaćin za interakciju s novčanikom.

Očekivani rezultat:

Novčanik prikazuje stanje i daje vam mogućnost uplatiti ili podići.

Razumijevanje Django predložaka i njihove uloge u upotrebi API-ja

Unatoč tome što su izvrsni za predstavljanje statičnog sadržaja, Django predlošci imaju određena ograničenja pri korištenju API-ja:

  • Ograničena fleksibilnost: Django predlošci su manje fleksibilni od onih kreiranih pomoću Jinja2 ili Twig jer se koriste za prikazivanje određenih struktura. Na primjer, morali biste ručno analizirati JSON i umetnuti podatke u predložak ako trebate koristiti API koji vraća JSON podatke. To može biti izazovno, uglavnom ako API isporučuje zamršene strukture podataka.
  • Nema podrške za asinkrone zahtjeve: Django predlošci izvorno nemaju sposobnost rukovanja asinkronim zahtjevima. Predlošci i dalje trebaju sinkronu obradu iako async/await suvremeni web okviri kao što su Flask i Django podržavaju sintaksu. To znači da biste morali pričekati da svi zahtjevi završe prije izrade predloška ako trebate prikupiti podatke iz brojnih izvora prije renderiranja stranice.
  • Ograničeno rukovanje pogreškama: Redovito se mogu pojaviti pogreške prilikom korištenja API-ja. Ne postoje ugrađeni mehanizmi za elegantno rukovanje pogreškama u Django predlošcima. Trebali biste uhvatiti iznimku i upravljati njome unutar samog predloška ako API poziv ne uspije, što bi moglo rezultirati nespretnim kodom koji je zahtjevan za održavanje.

Izradite skalabilne aplikacije

Omogućujući način za odvajanje prezentacijskog sloja od poslovne logike, Django predlošci omogućuju programerima da se usredotoče na stvaranje koda koji se može ponovno koristiti i održavati. Međutim, zbog svojih ograničenja, Django predlošci možda nisu najbolji izbor kada se API-ji koriste u velikom broju. Klijentski okviri poput Reacta i dalje su korisni u izgradnji skalabilnih aplikacija.