Можете без напора да користите једноставне АПИ-је без потребе да конфигуришете спољни фронтенд. Научите како да користите Дјанго шаблоне за употребу АПИ-ја.

Када користите позадинску технологију или оквир као што је Дјанго, Ларавел или Ноде.јс за писање РЕСТ АПИ-ја, потребно вам је да имате додатну вештину фронтенда користећи оквире као што су Реацт, Ангулар и Вуе да бисте користили АПИ крајње тачке. Али то није увек случај, можете користити АПИ-је у самом Дјангу користећи Дјанго шаблоне.

Подешавање Дјанго пројекта и крајњих тачака АПИ-ја

Први корак ће бити креирање директоријума пројекта. Отворите свој терминал и креирајте директоријум за свој пројекат.

mkdir payment_wallet_project
cd payment_wallet_project

За овај водич ћете направити АПИ-је за новчаник за плаћање.

Комплетан изворни код је доступан у а ГитХуб спремиште.

Старт би стварање виртуелног окружења. У овом случају, користићете библиотеку Пипенв.

pipenv install django djangorestframework

Ова команда инсталира потребне библиотеке као и креира виртуелно окружење.

Активирајте виртуелно окружење користећи наредбу испод:

pipenv shell

Направите нови Дјанго пројекат назван ПаиАпп.

django-admin startproject PayApp .

Коришћење тачке (.) на крају дјанго-админ команда обезбеђује да пројекат избегава креирање дупликата директоријума пројекта.

Створити нова Дјанго апликација у оквиру директоријума пројекта.

python manage.py startapp wallet

Сада наставите да правите своју АПИ апликацију користећи кораке у наставку.

Креирање РЕСТ АПИ-ја новчаника за плаћање

Отвори новчаник/модели.пи фајл и дефинише модел новчаника и трансакције.

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)

У новчаник директоријум, креирајте нову датотеку сериализерс.пи, и напишите серијализаторе модела новчаника и трансакција.

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

Сериализатори разматрају сва поља у моделима новчаника и трансакција.

У новчаник/виевс.пи, напишите погледе за руковање логиком имплементације функционалности новчаника. Ово укључује могућности депозита и повлачења.

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

Затим дефинишите УРЛ рутирање за АПИ тако што ћете креирати а валлет/урлс.пи фајл:

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

]

У вашем пројекту урлс.пи, укључити УРЛ адресе апликације:

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

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

У ПаиАпп/сеттингс.пи датотеку, додајте новчаник и рест_фрамворк апликације до ИНСТАЛЛЕД_АППС листа.

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

]

Ово ће регистровати апликације новчаника и рест_фрамеворк у апликацији Дјанго пројекта.

Коришћење АПИ-ја са Дјанго шаблонима

Сада ћете користити Дјанго шаблоне да креирате једноставан фронтенд за коришћење АПИ-ја. Створити валлет.хтмл фајл у новчаник/шаблони/ директоријум и додајте ХТМЛ код испод.


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



ХТМЛ датотека приказује АПИ-је за депозит и повлачење у прелепом корисничком интерфејсу дизајнираном помоћу Боотстрап-а.

Интеракција корисника са обрасцима

У ХТМЛ датотеци направите ознаку скрипте и додајте следећи код у слушалац догађаја за подношење обрасца депозита.

Затим додајте слушаоца догађаја за подношење обрасца за повлачење користећи код испод:

Слушалац догађаја је одговоран за руковање депозитом и повлачењем (#депосит-форм и #витхдрав-форм) поднесци обрасца.

УРЛ за захтев за преузимање је за подударање УРЛ адреса за радње депозита и повлачења.

ЈСОН одговори за депозите и повлачења се затим анализирају да би се добио ажурирани салдо (подаци.биланс). Затим се форматирају и приказују на страници.

Следеће, у новчаник/виевс.пи, додајте следеће ажурирање да бисте приказали валлет.хтмл страницу:

from django.shortcuts import render

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

У овом примеру ћете користити први() метода упита за одабир новчаника једног корисника у сврху демонстрације.

Ажурирајте урлс.пи датотеку додавањем путање до валлет_виев као што следи:

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

Да бисте приступили крајњим тачкама АПИ-ја, идите на http://127.0.0.1:8000/api/.

Очекивани излаз:

Идите до локални домаћин за интеракцију са новчаником.

Очекивани излаз:

Новчаник приказује стање и даје вам могућност да уплатите или повучете.

Разумевање Дјанго шаблона и њихове улоге у потрошњи АПИ-ја

Упркос томе што су одлични за представљање статичког садржаја, Дјанго шаблони имају одређена ограничења када користе АПИ-је:

  • Ограничена флексибилност: Дјанго шаблони су мање флексибилни од оних креираних помоћу Јиња2 или Твиг пошто се користе за приказивање одређених структура. На пример, морали бисте ручно да рашчланите ЈСОН и уметнете податке у шаблон ако желите да користите АПИ који враћа ЈСОН податке. Ово може бити изазовно, углавном ако АПИ испоручује сложене структуре података.
  • Нема подршке за асинхроне захтеве: Дјанго шаблони изворно немају могућност руковања асинхроним захтевима. Шаблонима је и даље потребна синхрона обрада иако асинц/аваит савремени веб оквири као што су Фласк и Дјанго подржавају синтаксу. То значи да бисте морали да сачекате да се сви захтеви заврше пре него што произведете шаблон ако је потребно да преузмете податке из бројних извора пре приказивања странице.
  • Ограничено руковање грешкама: Грешке се могу редовно јављати када користите АПИ-је. Не постоје уграђени механизми за елегантно руковање грешкама у Дјанго шаблонима. Мораћете да ухватите изузетак и управљате њиме унутар самог шаблона ако АПИ позив не успе, што би могло да доведе до неспретног и изазовног кода за одржавање.

Направите скалабилне апликације

Пружајући начин за одвајање слоја презентације од пословне логике, Дјанго предлошци омогућавају програмерима да се усредсреде на креирање кода за вишекратну употребу и одржавање. Међутим, због својих ограничења, Дјанго шаблони можда нису најбољи избор када се користе АПИ-ји у великом обиму. Клијентски оквири као што је Реацт су и даље корисни у изградњи скалабилних апликација.