Jednoduché rozhrania API môžete bez námahy používať bez potreby konfigurácie externého rozhrania. Zistite, ako používať šablóny Django na používanie rozhrania API.

Keď na písanie REST API používate backendovú technológiu alebo framework ako Django, Laravel alebo Node.js, potrebujete mať ďalšiu zručnosť frontendu pomocou rámcov ako React, Angular a Vue na používanie API koncové body. Ale to nie je vždy prípad, môžete použiť API v samotnom Django pomocou šablón Django.

Nastavenie projektu Django a koncových bodov API

Prvým krokom bude vytvorenie adresára projektu. Otvorte svoj terminál a vytvorte adresár pre svoj projekt.

mkdir payment_wallet_project
cd payment_wallet_project

Pre tento tutoriál vytvoríte API pre platobnú peňaženku.

Úplný zdrojový kód je dostupný v a úložisko GitHub.

Začnite tým vytváranie virtuálneho prostredia. V tomto prípade použijete knižnicu Pipenv.

pipenv install django djangorestframework

Tento príkaz nainštaluje potrebné knižnice a vytvorí virtuálne prostredie.

Aktivujte virtuálne prostredie pomocou príkazu nižšie:

pipenv shell

Vytvorte nový projekt Django pomenovaný PayApp.

django-admin startproject PayApp .

Použitie bodky (.) na konci django-admin príkaz zaisťuje, že sa projekt vyhne vytvoreniu duplicitného adresára adresára projektu.

Vytvor nová aplikácia Django v adresári projektu.

python manage.py startapp wallet

Teraz pokračujte v zostavovaní aplikácie API pomocou krokov uvedených nižšie.

Vytvorenie REST API platobnej peňaženky

Otvor wallet/models.py a definujte modely peňaženky a transakcie.

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)

V peňaženku adresár, vytvorte nový súbor serializers.pya napíšte serializátory modelu peňaženky a transakcií.

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

Serializátory berú do úvahy všetky polia v modeloch peňaženky a transakcií.

In wallet/views.py, napíšte pohľady na spracovanie logiky implementácie funkčnosti peňaženky. To zahŕňa možnosti vkladu a výberu.

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

Ďalej definujte smerovanie URL pre API vytvorením a wallet/urls.py súbor:

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

]

Vo vašom projekte urls.py, zahrňte adresy URL aplikácie:

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

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

V PayApp/settings.py súbor, pridajte peňaženku a rest_framwork aplikácie k INSTALLED_APPS zoznam.

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

]

Týmto sa zaregistrujú aplikácie peňaženka a rest_framework do projektovej aplikácie Django.

Spotreba API so šablónami Django

Teraz použijete šablóny Django na vytvorenie jednoduchého rozhrania na používanie rozhrania API. Vytvor wallet.html súbor v peňaženka/šablóny/ a pridajte nižšie uvedený HTML kód.


"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>



Súbor HTML vykresľuje rozhrania API na vklad a výber v krásnom používateľskom rozhraní navrhnutom pomocou Bootstrap.

Interakcia používateľa s formulármi

V súbore HTML vytvorte značku skriptu a pridajte nasledujúci kód do prijímača udalosti odoslania vkladového formulára.

Potom pridajte poslucháča udalosti na odoslanie formulára na odstúpenie od zmluvy pomocou kódu nižšie:

Poslucháč udalosti je zodpovedný za spracovanie vkladu a výberu (#vkladový formulár a #formulár na odstúpenie od zmluvy) odoslania formulárov.

Adresa URL žiadosti o načítanie slúži na zhodu s adresami URL pre akcie vkladu a výberu.

Odpovede JSON pre vklady a výbery sa potom analyzujú, aby sa získal aktualizovaný zostatok (údaje.zostatok). Potom sa naformátujú a zobrazia na stránke.

Ďalej v wallet/views.py, pridajte nasledujúcu aktualizáciu na vykreslenie stránky 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})

V tomto príklade použijete najprv() dotaz na výber peňaženky jedného používateľa na demonštračné účely.

Aktualizujte urls.py pridaním cesty k súboru wallet_view nasledovne:

from .views import wallet_view

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

Prejdite na stránku peňaženky z adresy URL: http://127.0.0.1:8000/home/.

Keď je všetko nastavené a funguje podľa očakávania, spustite migrácie a migrovať príkazy. Nakoniec spustite aplikáciu:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

Ak chcete získať prístup ku koncovým bodom rozhrania API, prejdite na http://127.0.0.1:8000/api/.

Očakávaný výstup:

Prejdite na localhost na interakciu s peňaženkou.

Očakávaný výstup:

Peňaženka zobrazuje zostatok a dáva vám možnosť buď vložiť, alebo vybrať.

Pochopenie šablón Django a ich úlohy pri spotrebe API

Napriek tomu, že sú vynikajúce na prezentáciu statického obsahu, šablóny Django majú určité obmedzenia pri používaní rozhraní API:

  • Obmedzená flexibilita: Šablóny Django sú menej flexibilné ako šablóny vytvorené pomocou Jinja2 alebo Twig, pretože sa používajú na zobrazenie špecifikovaných štruktúr. Ak by ste napríklad potrebovali použiť rozhranie API, ktoré vrátilo údaje JSON, museli by ste manuálne analyzovať JSON a vložiť údaje do šablóny. To môže byť náročné, najmä ak API poskytuje zložité dátové štruktúry.
  • Žiadna podpora pre asynchrónne požiadavky: Šablóny Django natívne nemajú schopnosť spracovať asynchrónne požiadavky. Šablóny stále potrebujú synchrónne spracovanie, aj keď súčasné webové rámce async/wait ako Flask a Django podporujú syntax. To znamená, že ak by ste pred vykreslením stránky potrebovali získať údaje z mnohých zdrojov, museli by ste pred vytvorením šablóny počkať na dokončenie všetkých požiadaviek.
  • Obmedzené spracovanie chýb: Pri používaní rozhraní API sa môžu pravidelne vyskytovať chyby. V šablónach Django neexistujú žiadne vstavané mechanizmy na elegantné spracovanie chýb. Ak volanie API zlyhá, budete musieť zachytiť výnimku a spravovať ju v samotnej šablóne, čo by mohlo viesť k nemotornému a náročnému kódu na údržbu.

Vytvárajte škálovateľné aplikácie

Poskytnutím spôsobu, ako oddeliť prezentačnú vrstvu od obchodnej logiky, umožňujú šablóny Django vývojárom zamerať sa na vytváranie opätovne použiteľného a udržiavateľného kódu. Vzhľadom na svoje obmedzenia však šablóny Django nemusia byť najlepšou voľbou pri využívaní API vo veľkom rozsahu. Klientske rámce ako React sú stále užitočné pri vytváraní škálovateľných aplikácií.