Galite be vargo naudoti paprastas API, nekonfigūruodami išorinės sąsajos. Sužinokite, kaip naudoti „Django“ šablonus API naudojimui.

Kai REST API rašyti naudojate pagrindinę technologiją arba sistemą, pvz., Django, Laravel arba Node.js, jums reikia turėti papildomų sąsajos įgūdžių naudojant tokias sistemas kaip „React“, „Angular“ ir „Vue“, kad būtų galima naudoti API galutiniai taškai. Tačiau taip būna ne visada, galite naudoti API pačiame „Django“ naudodami „Django“ šablonus.

„Django“ projekto ir API galinių taškų nustatymas

Pirmas žingsnis bus sukurti projekto katalogą. Atidarykite terminalą ir sukurkite projekto katalogą.

mkdir payment_wallet_project
cd payment_wallet_project

Šioje pamokoje sukursite mokėjimo piniginės API.

Visą šaltinio kodą rasite a GitHub saugykla.

Pradėkite nuo sukurti virtualią aplinką. Tokiu atveju naudosite Pipenv biblioteką.

pipenv install django djangorestframework

Ši komanda įdiegia reikiamas bibliotekas ir sukuria virtualią aplinką.

Suaktyvinkite virtualią aplinką naudodami toliau pateiktą komandą:

instagram viewer
pipenv shell

Sukurkite naują Django projektą pavadintas PayApp.

django-admin startproject PayApp .

Naudojant tašką (.) pabaigoje django-admin komanda užtikrina, kad projektas nekurtų pasikartojančio projekto katalogo katalogo.

Sukurti nauja Django programa projektų kataloge.

python manage.py startapp wallet

Dabar kurkite API programą atlikdami toliau nurodytus veiksmus.

Mokėjimų piniginės REST API sukūrimas

Atidaryk piniginė/models.py failą ir apibrėžti piniginės bei operacijų modelius.

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)

Viduje piniginė kataloge, sukurkite naują failą serializers.py, ir parašykite piniginės ir operacijos modelio serializatorius.

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

Serializatoriai atsižvelgia į visus piniginės ir operacijų modelių laukus.

Į wallet/views.py, parašykite vaizdus, ​​kaip valdyti piniginės funkcionalumo diegimo logiką. Tai apima indėlio ir išėmimo galimybes.

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

Tada nustatykite API URL maršrutą sukurdami a piniginė/urls.py failas:

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

]

Jūsų projekte urls.py, įtraukite programos URL:

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

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

Viduje PayApp/settings.py failą, pridėkite piniginė ir rest_framwork programos prie INSTALLED_APPS sąrašą.

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

]

Tai užregistruos piniginės ir rest_framework programas Django projekto programoje.

API naudojimas naudojant „Django“ šablonus

Dabar naudosite „Django“ šablonus, kad sukurtumėte paprastą sąsają, skirtą naudoti API. Sukurti piniginė.html failą piniginė/šablonai/ katalogą ir toliau pridėkite 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 failas pateikia įnešimo ir išėmimo API gražioje vartotojo sąsajoje, sukurtoje naudojant „Bootstrap“.

Vartotojo sąveika su formomis

HTML faile sukurkite scenarijaus žymą ir pridėkite šį kodą į įmokos formos pateikimo įvykių klausytoją.

Tada pridėkite atsiėmimo formos pateikimo įvykių klausytoją naudodami toliau pateiktą kodą:

Renginio klausytojas yra atsakingas už įnešimo ir išėmimo tvarkymą (#indėlio forma ir #atsiėmimo forma) formos pateikimus.

Gavimo užklausos URL yra skirtas sutapti su indėlio ir išėmimo veiksmų URL.

Tada JSON atsakymai į indėlius ir išėmimus išanalizuojami, kad būtų gautas atnaujintas balansas (duomenys.balansas). Tada jie suformatuojami ir rodomi puslapyje.

Toliau, į wallet/views.py, pridėkite šį naujinimą, kad būtų pateiktas wallet.html puslapis:

from django.shortcuts import render

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

Šiame pavyzdyje naudosite Pirmas() užklausos metodas, skirtas pasirinkti vieno vartotojo piniginę demonstravimo tikslais.

Atnaujinkite urls.py failą pridėdami kelią prie piniginės_vaizdas taip:

from .views import wallet_view

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

Pasiekite piniginės puslapį naudodami URL: http://127.0.0.1:8000/home/.

Kai viskas nustatyta ir veikia taip, kaip tikėtasi, vykdykite daro migracijas ir migruoti komandas. Galiausiai paleiskite programą:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

Norėdami pasiekti API galinius taškus, eikite į http://127.0.0.1:8000/api/.

Numatoma produkcija:

Eikite į vietinis šeimininkas bendrauti su pinigine.

Numatoma produkcija:

Piniginė rodo likutį ir suteikia galimybę įnešti arba išimti.

„Django“ šablonų supratimas ir jų vaidmuo naudojant API

Nepaisant to, kad Django šablonai puikiai tinka statiniam turiniui pateikti, jie turi tam tikrų apribojimų naudojant API:

  • Ribotas lankstumas: Django šablonai yra mažiau lankstūs nei sukurti naudojant Jinja2 arba Twig, nes jie naudojami nurodytoms struktūroms rodyti. Pavyzdžiui, turėsite rankiniu būdu išanalizuoti JSON ir įterpti duomenis į šabloną, jei reikia naudoti API, kuri grąžino JSON duomenis. Tai gali būti sudėtinga, ypač jei API pateikia sudėtingas duomenų struktūras.
  • Nepalaikoma asinchroninių užklausų: Django šablonams iš esmės trūksta galimybės apdoroti asinchronines užklausas. Šablonus vis tiek reikia sinchroniškai apdoroti, nors asinchronizavimo / laukimo šiuolaikinės žiniatinklio sistemos, tokios kaip „Flask“ ir „Django“, palaiko sintaksę. Tai reiškia, kad prieš sukurdami šabloną turėsite palaukti, kol bus baigtos visos užklausos, jei prieš pateikiant puslapį reikia gauti duomenų iš daugelio šaltinių.
  • Ribotas klaidų tvarkymas: naudojant API, gali atsirasti klaidų reguliariai. „Django“ šablonuose nėra integruotų mechanizmų, leidžiančių grakščiai valdyti klaidas. Jei API iškvietimas nepavyktų, turėsite užfiksuoti išimtį ir valdyti ją pačiame šablone, o tai gali sukelti gremėzdišką ir sudėtingą prižiūrėti kodą.

Sukurkite keičiamo dydžio programas

Suteikdami būdą atskirti pristatymo sluoksnį nuo verslo logikos, „Django“ šablonai leidžia kūrėjams sutelkti dėmesį į daugkartinio naudojimo ir prižiūrimo kodo kūrimą. Tačiau dėl savo apribojimų „Django“ šablonai gali būti ne geriausias pasirinkimas naudojant API dideliu mastu. Tokios klientų sistemos kaip „React“ vis dar naudingos kuriant keičiamo dydžio programas.