Harici bir ön uç yapılandırmanıza gerek kalmadan basit API'leri zahmetsizce kullanabilirsiniz. API tüketimi için Django şablonlarının nasıl kullanılacağını öğrenin.

REST API'leri yazmak için Django, Laravel veya Node.js gibi bir arka uç teknolojisi veya çerçevesi kullanırken şunları yapmanız gerekir: API'yi kullanmak için React, Angular ve Vue gibi çerçeveleri kullanma konusunda ek bir ön uç becerisine sahip olmak uç noktalar. Ancak durum her zaman böyle değildir; Django şablonlarını kullanarak API'leri Django'nun kendisinde kullanabilirsiniz.

Django Projesi ve API Uç Noktalarını Ayarlama

İlk adım bir proje dizini oluşturmak olacaktır. Terminalinizi açın ve projeniz için bir dizin oluşturun.

mkdir payment_wallet_project
cd payment_wallet_project

Bu eğitimde ödeme cüzdanı için API'ler oluşturacaksınız.

Kaynak kodunun tamamı şu adreste mevcuttur: GitHub deposu.

La başlamak sanal bir ortam oluşturmak. Bu durumda Pipenv kütüphanesini kullanacaksınız.

pipenv install django djangorestframework

Bu komut gerekli kütüphaneleri kurmanın yanı sıra sanal bir ortam oluşturur.

instagram viewer

Aşağıdaki komutu kullanarak sanal ortamı etkinleştirin:

pipenv shell

Yeni bir Django projesi oluşturun adlandırılmış PayApp.

django-admin startproject PayApp .

Noktayı kullanma (.) sonunda django-admin komutu, projenin, proje dizininin yinelenen bir dizinini oluşturmaktan kaçınmasını sağlar.

Oluşturmak yeni Django uygulaması proje dizini içerisinde.

python manage.py startapp wallet

Şimdi aşağıdaki adımları kullanarak API uygulamanızı oluşturmaya devam edin.

Ödeme Cüzdanı REST API'si Oluşturma

cüzdan/models.py M-cüzdan ve işlem modellerini dosyalayın ve tanımlayın.

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)

İçinde cüzdan dizin, yeni bir dosya oluştur serileştiriciler.pyve cüzdan ve işlem modeli serileştiricilerini yazın.

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

Serileştiriciler, cüzdandaki ve işlem modellerindeki tüm alanları dikkate alır.

İçinde cüzdan/views.py, cüzdan işlevselliğini uygulama mantığını işlemeye yönelik görünümleri yazın. Buna para yatırma ve çekme yetenekleri de dahildir.

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

Daha sonra, bir API oluşturarak API için URL yönlendirmesini tanımlayın. cüzdan/urls.py dosya:

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

]

Projenizde urls.py, uygulamanın URL'lerini ekleyin:

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

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

İçinde PayApp/settings.py dosyayı ekleyin cüzdan Ve rest_framework uygulamaları -e INSTALLED_APPS liste.

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

]

Bu, cüzdan ve rest_framework uygulamalarını Django proje uygulamasına kaydedecektir.

API'yi Django Şablonlarıyla Kullanmak

Artık API'yi kullanmak için basit bir ön uç oluşturmak amacıyla Django şablonlarını kullanacaksınız. Oluşturmak cüzdan.html dosyadaki cüzdan/şablonlar/ dizini açın ve aşağıdaki HTML kodunu ekleyin.


"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 dosyası, para yatırma ve çekme API'lerini Bootstrap kullanılarak tasarlanmış güzel bir kullanıcı arayüzünde işler.

Formlarla Kullanıcı Etkileşimi

HTML dosyasında bir komut dosyası etiketi oluşturun ve aşağıdaki kodu para yatırma formu gönderme etkinliği işleyicisine ekleyin.

Daha sonra, aşağıdaki kodu kullanarak para çekme formu gönderimi için olay dinleyicisini ekleyin:

Etkinlik dinleyicisi para yatırma ve çekme işlemlerinden sorumludur (#para yatırma formu Ve #geri çekilme formu) form gönderimleri.

Getirme isteğinin URL'si, para yatırma ve çekme işlemlerine ilişkin URL'leri eşleştirmek içindir.

Para yatırma ve çekme işlemlerine ilişkin JSON yanıtları daha sonra güncellenmiş bakiyeyi elde etmek için ayrıştırılır (veri.dengesi). Daha sonra biçimlendirilir ve sayfada görüntülenirler.

Daha sonra, cüzdan/views.pyWallet.html sayfasını oluşturmak için aşağıdaki güncellemeyi ekleyin:

from django.shortcuts import render

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

Bu örnekte, şunu kullanacaksınız: Birinci() Gösterim amacıyla tek bir kullanıcının cüzdanını seçmek için sorgulama yöntemi.

Güncelleme urls.py dosyaya bir yol ekleyerek cüzdan_görünümü aşağıdaki gibi:

from .views import wallet_view

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

M-cüzdan sayfasına URL'den erişin: http://127.0.0.1:8000/home/.

Her şey ayarlandığında ve beklendiği gibi çalıştığında, göç yapmak Ve göç komutlar. Son olarak uygulamayı çalıştırın:

python manage.py makemigrations
python manage.py migrate

python manage.py runserver

API uç noktalarına erişmek için şuraya gidin: http://127.0.0.1:8000/api/.

Beklenen çıktı:

Şuraya gidin: yerel ana bilgisayar cüzdanla etkileşime geçmek için.

Beklenen çıktı:

M-cüzdan bakiyeyi gösterir ve size para yatırma veya çekme seçeneği sunar.

Django Şablonlarını ve API Tüketimindeki Rollerini Anlamak

Statik içerik sunmak için mükemmel olmalarına rağmen, Django şablonlarının API'leri kullanırken bazı kısıtlamaları vardır:

  • Sınırlı esneklik: Django şablonları, belirtilen yapıları görüntülemek için kullanıldıkları için Jinja2 veya Twig kullanılarak oluşturulanlardan daha az esnektir. Örneğin, JSON verilerini döndüren bir API kullanmanız gerekiyorsa, JSON'u manuel olarak ayrıştırmanız ve verileri şablona eklemeniz gerekir. Özellikle API'nin karmaşık veri yapıları sunması durumunda bu zorlayıcı olabilir.
  • Eşzamansız istekler için destek yok: Django şablonları doğal olarak eşzamansız istekleri işleme yeteneğinden yoksundur. Flask ve Django gibi eşzamansız/beklemede çağdaş web çerçeveleri sözdizimini desteklese de şablonların hâlâ eşzamanlı işlemeye ihtiyacı vardır. Bu, bir sayfayı oluşturmadan önce çok sayıda kaynaktan veri almanız gerekiyorsa, şablonu oluşturmadan önce tüm isteklerin bitmesini beklemeniz gerektiği anlamına gelir.
  • Sınırlı hata işleme: API'leri kullanırken düzenli olarak hatalar meydana gelebilir. Django şablonlarında hassas hata yönetimi için yerleşik mekanizmalar yoktur. Bir API çağrısı başarısız olursa, istisnayı yakalamanız ve onu şablonun içinde yönetmeniz gerekir; bu da kodun hantal ve bakımı zor olmasına neden olabilir.

Ölçeklenebilir Uygulamalar Oluşturun

Sunum katmanını iş mantığından ayırmanın bir yolunu sunan Django şablonları, geliştiricilerin yeniden kullanılabilir ve bakımı yapılabilir kod oluşturmaya odaklanmasına olanak tanır. Ancak sınırlamaları nedeniyle Django şablonları, API'leri geniş ölçekte tüketirken en iyi seçim olmayabilir. React gibi istemci çerçeveleri, ölçeklenebilir uygulamalar oluşturmada hâlâ faydalıdır.