Вы можете легко использовать простые 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 для платежного кошелька.

Полный исходный код доступен в Репозиторий GitHub.

Начать с создание виртуальной среды. В этом случае вы будете использовать библиотеку Pipenv.

pipenv install django djangorestframework

Эта команда устанавливает необходимые библиотеки, а также создает виртуальную среду.

instagram viewer

Активируйте виртуальную среду с помощью команды ниже:

pipenv shell

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

django-admin startproject PayApp .

Используя точку (.) в конце Джанго-админ Команда гарантирует, что проект не будет создавать дубликат каталога проекта.

Создать новое приложение Джанго в каталоге проекта.

python manage.py startapp wallet

Теперь приступайте к созданию приложения API, выполнив следующие действия.

Создание REST API платежного кошелька

Открой кошелек/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)

в кошелек каталог, создайте новый файл сериализаторы.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__'

Сериализаторы учитывают все поля моделей кошелька и транзакций.

В кошелек/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, создав кошелек/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_framework к 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

]

При этом приложения Wallet и rest_framework будут зарегистрированы в приложении проекта Django.

Использование API с шаблонами Django

Теперь вы будете использовать шаблоны Django для создания простого интерфейса для использования API. Создать кошелек.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 на депозиты и снятие средств затем анализируются для получения обновленного баланса (данные.баланс). Затем они форматируются и отображаются на странице.

Далее, в кошелек/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 изначально не поддерживают асинхронные запросы. Шаблоны по-прежнему нуждаются в синхронной обработке, хотя современные веб-фреймворки, такие как Flask и Django, поддерживают синтаксис async/await. Это означает, что вам придется дождаться завершения всех запросов, прежде чем создавать шаблон, если вам нужно получить данные из многочисленных источников перед отображением страницы.
  • Ограниченная обработка ошибок: При использовании API могут регулярно возникать ошибки. В шаблонах Django нет встроенных механизмов корректной обработки ошибок. В случае сбоя вызова API вам придется перехватить исключение и управлять им внутри самого шаблона, что может привести к неуклюжему и сложному в обслуживании коду.

Создавайте масштабируемые приложения

Предоставляя возможность отделить уровень представления от бизнес-логики, шаблоны Django позволяют разработчикам сосредоточиться на создании многократно используемого и удобного в обслуживании кода. Однако из-за своих ограничений шаблоны Django могут быть не лучшим выбором при использовании API в больших масштабах. Клиентские платформы, такие как React, по-прежнему полезны при создании масштабируемых приложений.