Можете без усилие да използвате прости API, без да е необходимо да конфигурирате външен интерфейс. Научете как да използвате Django шаблони за използване на API.

Когато използвате бекенд технология или рамка като Django, Laravel или Node.js за писане на REST API, имате нужда да имате допълнително умение за интерфейс, използвайки рамки като React, Angular и Vue, за да използвате API крайни точки. Но това не винаги е така, можете да използвате API в самия Django, като използвате Django шаблони.

Настройване на Django проект и крайни точки на API

Първата стъпка ще бъде да създадете директория на проекта. Отворете вашия терминал и създайте директория за вашия проект.

mkdir payment_wallet_project
cd payment_wallet_project

За този урок ще създадете API за портфейл за плащане.

Пълният изходен код е достъпен в a GitHub хранилище.

Започнете от създаване на виртуална среда. В този случай ще използвате библиотеката Pipenv.

pipenv install django djangorestframework

Тази команда инсталира необходимите библиотеки, както и създава виртуална среда.

instagram viewer

Активирайте виртуалната среда, като използвате командата по-долу:

pipenv shell

Създайте нов Django проект на име PayApp.

django-admin startproject PayApp .

Използване на точката (.) в края на django-admin командата гарантира, че проектът избягва създаването на дублираща се директория на директорията на проекта.

Създавам ново приложение Django в директорията на проекта.

python manage.py startapp wallet

Сега продължете да създавате вашето API приложение, като използвате стъпките по-долу.

Създаване на REST API на Payment Wallet

Отвори wallet/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__'

Сериализаторите вземат предвид всички полета в моделите на портфейла и транзакциите.

в wallet/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, като създадете a wallet/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 файла създайте таг на скрипт и добавете следния код към слушателя на събитието за подаване на формуляр за депозит.

След това добавете слушателя на събития за изпращане на формуляр за теглене, като използвате кода по-долу:

Слушателят на събитие е отговорен за обработката на депозита и тегленето (#депозитна форма и #форма за теглене) изпращане на формуляри.

URL адресът за заявката за извличане е за съпоставяне на URL адресите за действия по депозит и теглене.

След това JSON отговорите за депозитите и тегленията се анализират, за да се получи актуализираният баланс (данни.баланс). След това се форматират и показват на страницата.

На следващо място, в wallet/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/.

Очакван резултат:

Навигирайте до локален хост за взаимодействие с портфейла.

Очакван резултат:

Портфейлът показва баланса и ви дава възможност да депозирате или да теглите.

Разбиране на Django шаблоните и тяхната роля в потреблението на API

Въпреки че са отлични за представяне на статично съдържание, Django шаблоните имат определени ограничения при използване на API:

  • Ограничена гъвкавост: Django шаблоните са по-малко гъвкави от тези, създадени с помощта на Jinja2 или Twig, тъй като се използват за показване на определени структури. Например, ще трябва ръчно да анализирате JSON и да вмъкнете данните в шаблона, ако трябва да използвате API, който връща JSON данни. Това може да бъде предизвикателство, главно ако API доставя сложни структури от данни.
  • Няма поддръжка за асинхронни заявки: Django шаблоните изначално нямат способността да обработват асинхронни заявки. Шаблоните все още се нуждаят от синхронна обработка, въпреки че async/await съвременните уеб рамки като Flask и Django поддържат синтаксис. Това означава, че ще трябва да изчакате всички заявки да приключат, преди да създадете шаблона, ако трябва да получите данни от множество източници, преди да изобразите страница.
  • Ограничена обработка на грешки: Редовно могат да възникват грешки при използване на API. Няма вградени механизми за грациозна обработка на грешки в шаблоните на Django. Ще трябва да хванете изключението и да го управлявате в самия шаблон, ако извикването на API е неуспешно, което може да доведе до тромав и труден за поддръжка код.

Създавайте мащабируеми приложения

Като предоставят начин за отделяне на презентационния слой от бизнес логиката, шаблоните на Django позволяват на разработчиците да се съсредоточат върху създаването на повторно използваем и поддържаем код. Въпреки това, поради техните ограничения, шаблоните на Django може да не са най-добрият избор при мащабно използване на API. Клиентските рамки като React все още са полезни при изграждането на мащабируеми приложения.