این راهنمای گام به گام را دنبال کنید و هسته یک CRUD API را خواهید داشت که می توانید بر اساس آن بیشتر بسازید.
Django Rest Framework (DRF) یک چارچوب جنگو است که از ساخت API های REST پشتیبانی می کند. مانند جنگو، DRF به شما امکان می دهد نماهای API خود را با نماهای مبتنی بر عملکرد یا کلاس بسازید.
اگرچه کار کردن با نماهای مبتنی بر کلاس در ابتدا ممکن است دشوار باشد، اما مزایایی مانند ساختار کد بهتر، قابلیت استفاده مجدد، وراثت و مختصر بودن را ارائه می دهند.
یک Recipe Manager API با چارچوب Django REST ایجاد کنید
یک برنامه مدیریت دستور غذا روشی عالی برای یادگیری نماهای مبتنی بر کلاس در DRF است. ویژگی هایی مانند افزودن، حذف و ویرایش دستور العمل ها به شما کمک می کند تا نحوه اجرای عملیات CRUD (ایجاد، خواندن، به روز رسانی، حذف) را درک کنید. مراحل زیر به شما یاد می دهد که چگونه یک CRUD API ایجاد کنید.
می توانید کد این راهنما را در GitHub پیدا کنید.
مرحله ۱: چارچوب Django REST را نصب کرده و پروژه خود را پیکربندی کنید
- یک محیط مجازی برای پروژه خود ایجاد کنید و وابستگی های زیر را نصب کنید: pip install django djangorestframework
- با دستور زیر یک پروژه جنگو به نام core ایجاد کنید: django-admin startproject core.
- برنامه ای به نام recipe_manager ایجاد کنید: python manager.py startapp recipe_manager
- فایل core/settings.py خود را باز کنید و به لیست INSTALLED_APPS بروید تا برنامه های خود را ثبت کنید: INSTALLED_APPS = [ # برنامه سفارشی ‘rest_framework’, ‘recipe_manager’,]
pip install django djangorestframework
django-admin startproject core .
python manage.py startapp recipe_manager
INSTALLED_APPS = [
# custom apps
'rest_framework',
'recipe_manager',
]
مرحله ۲: یک مدل برای برنامه دستور غذا ایجاد کنید
- فایل recipe_manager/models.py خود را باز کنید و یک مدل برای برنامه خود ایجاد کنید. در اینجا یک مثال اساسی از یک مدل دستور غذا آورده شده است: # models.pyfrom django.db import modelsclass Recipe(models.Model): recipe_name = models.CharField(max_length=۲۵۵) ingredients = models.TextField() (s) دستورالعملهای TextField() (s)
- مهاجرت ایجاد کنید و مدل خود را با این دستور به پایگاه داده منتقل کنید: python manager.py makemigrations && python manager.py migrate
# models.py
from django.db import models
class Recipe(models.Model):
recipe_name = models.CharField(max_length=255)
ingredients = models.TextField()
instructions = models.TextField()
python manage.py makemigrations && python manage.py migrate
مرحله ۳: یک سریال ساز برای برنامه خود ایجاد کنید
سریالساز یک جزء جنگو است که به شما کمک میکند انواع دادههای پیچیده مانند مجموعه پرس و جو خود را به قالبی تبدیل کنید که بتوانید آن را مانند JSON یا XML و بالعکس تبدیل کنید.
برای ایجاد سریالساز، مراحل زیر را دنبال کنید:
- فایلی به نام recipe_manager/serializers.py ایجاد کنید.
- ماژول سریالسازها و همچنین مدلی را که میخواهید سریالسازی کنید وارد کنید: # serializers.pyfrom rest_framework import serializersfrom .models دستور # مدل برای سریالسازی را وارد کنید
- در همان فایل، یک کلاس سریالساز برای مدل خود ایجاد کنید و کلاس Meta را در آن تعریف کنید: # serializers.pyclass RecipeSerializer(serializer.ModelSerializer): Class Meta: model = Recipe ‘, ‘in recipestruction names = (‘, recipe_ions ‘) در این کد، کلاس Meta مدلی را برای سریال سازی و فیلدهای خاصی که سریال ساز باید مدیریت کند، تعریف می کند. ویژگی فیلدها می تواند یک لیست یا یک تاپل باشد. اگر می خواهید تمام فیلدهای مدل خود را سریالی کنید، می توانید این کار را به صورت زیر انجام دهید: class Meta: fields = “__all__”
# serializers.py
from rest_framework import serializers
from .models import Recipe # the model to serialize
# serializers.py
class RecipeSerializer(serializers.ModelSerializer):
class Meta:
model = Recipe
fields = ('recipe_name', 'ingredients', 'instructions')
class Meta:
fields = "__all__"
مرحله ۴: یک View برای عملیات CREATE بنویسید
میتوانید با وارد کردن نمای عمومی موجود در جنگو، نماهای مبتنی بر کلاس برای برنامه خود ایجاد کنید. شما می توانید در مورد این دیدگاه ها از اسناد رسمی جنگو بخوانید. برای اجرای عملیات CREATE CRUD، باید CreateAPIView را وارد کنید. همچنین باید سریالساز و مدل خود را وارد کنید:
# views.py
from rest_framework.generics import CreateAPIView
from .models import Recipe
from .serializers import RecipeSerializer
برای اجرای عملیات CREATE، فقط باید سریالسازی را که view شما باید استفاده کند را مشخص کنید. در اینجا یک مثال است:
# Create view
class RecipeCreateView(CreateAPIView):
serializer_class = RecipeSerializer
با این تنظیمات، می توانید درخواست های POST را به برنامه خود ارسال کنید.
مرحله ۵: یک View برای عملیات READ بنویسید
- برای اجرای عملیات READ، ListAPIView را به view های خود وارد کنید. این نما به شما کمک می کند اشیاء مدل را فهرست کنید: # views.pyfrom rest_framework.generics import CreateAPIView, ListAPIView
- یک کلاس برای نماهای خود ایجاد کنید و سریالساز و مجموعه پرس و جو را برای استفاده مشخص کنید: # List viewclass RecipeListView(ListAPIView): serializer_class = RecipeSerializer queryset = Recipe.objects.all()
- یک نما برای خواندن یک دستور پخت خاص ایجاد کنید. برای انجام این کار، به RetrieveAPIView نیاز دارید، بنابراین آن را به لیست واردات خود اضافه کنید: # views.pyfrom rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView سپس نمای مورد نیاز خود را ایجاد کنید: # Retrieve viewclass RecipeRetrieveView(Retrieve RecipeRetrieveView(Retrieve _class. = Recipe.objects.all()
# views.py
from rest_framework.generics import CreateAPIView, ListAPIView
# List view
class RecipeListView(ListAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
# views.py
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView
# Retrieve view
class RecipeRetrieveView(RetrieveAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
مرحله ۶: برای عملیات UPDATE و DELETE Views بنویسید
برای اجرای عملیات UPDATE و DELETE، به ترتیب به UpdateAPIView و DestroyAPIView نیاز دارید، بنابراین آنها را وارد کنید:
from rest_framework.generics import (
ListAPIView,
CreateAPIView,
RetrieveAPIView,
UpdateAPIView, # new
DestroyAPIView, # new
)
در مرحله بعد، نماها را درست مانند قبل ایجاد کنید. این بار، دیدگاه های شما به ترتیب از UpdateAPIView و DestroyAPIView به ارث می رسد:
# Update view
class RecipeUpdateView(UpdateAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
# Delete view
class RecipeDeleteView(DestroyAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
مرحله ۷: URL ها را برای برنامه خود ایجاد کنید
- این کد را به core/urls.py اضافه کنید تا URLهای خود را پیکربندی کنید: از مسیر واردات django.urls، includeurlpatterns = [ path(‘api/’, include(‘recipe_manager.urls’))]
- کد زیر را به فایل recipe_manager/urls.py خود اضافه کنید: from django.urls import pathfrom. import viewsurlpatterns = [ # نمای فهرست (خواندن همه) path(‘recipes/’, views.RecipeListView.as_view(), name=’recipe-list’), # Create view path(‘recipes/create/’, views.RecipeCreateView .as_view()، name=’recipe-create’), # Retrieve view (Read one) path(‘recipes/
/’, views.RecipeRetrieveView.as_view(), name=’recipe-retrieve’) , # بهروزرسانی نمای مسیر (‘recipes/ /update/’, views.RecipeUpdateView.as_view(), name=’recipe-update’), # Delete view path(‘recipes/ / delete/’, views.RecipeDeleteView.as_view(), name=’recipe-destroy’),] از کد بالا، مشاهده خواهید کرد که view های مبتنی بر کلاس از تابع as_view() برای ایجاد الگوهای URL خود استفاده می کنند. همچنین میتوانید در مورد تفاوتهای بین یک پروژه و یک برنامه در جنگو، اگر در استفاده از آنها گیج شدهاید، اینجا بخوانید.
from django.urls import path, include
urlpatterns = [
path('api/', include('recipe_manager.urls'))
]
from django.urls import path
from . import views
urlpatterns = [
# List view (Read all)
path('recipes/', views.RecipeListView.as_view(), name='recipe-list'),
# Create view
path('recipes/create/', views.RecipeCreateView.as_view(), name='recipe-create'),
# Retrieve view (Read one)
path('recipes/<int:pk>/', views.RecipeRetrieveView.as_view(), name='recipe-retrieve'),
# Update view
path('recipes/<int:pk>/update/', views.RecipeUpdateView.as_view(), name='recipe-update'),
# Delete view
path('recipes/<int:pk>/delete/', views.RecipeDeleteView.as_view(), name='recipe-destroy'),
]
مرحله ۸: نقاط پایانی API خود را آزمایش کنید
از دایرکتوری پروژه خود، موارد زیر را اجرا کنید:
python manage.py runserver
این باید سرور شما را راه اندازی کند، برخی بررسی ها را انجام دهد و یک URL چاپ کند که می توانید از طریق آن به آن دسترسی داشته باشید.
اکنون می توانید با پیمایش به URL های مربوطه (به عنوان مثال /api/recipes/) و ارسال روش های درخواست HTTP برای عملیات CRUD، نقاط پایانی API خود را آزمایش کنید. شما باید یک رابط پیش فرض مانند این را ببینید:

به جای استفاده از مرورگر خود، می توانید API خود را با Postman تست کنید.
تمرین DRY هنگام ایجاد یک CRUD API
DRY (خودت را تکرار نکن) یک اصل برنامه نویسی است که باید برای بهبود کیفیت کد خود اتخاذ کنید.
اگرچه نماهای نوشته شده در بالا به خوبی کار می کنند، اما می توانید با استفاده از نماهای عمومی ListCreateAPIView و RetrieveUpdateDestroyAPIView از تکرار زیاد جلوگیری کنید.
ListCreateAPIView ListAPIView و CreateAPIView را ترکیب می کند، در حالی که RetrieveUpdateDestroyAPIView RetrieveAPIView، UpdateAPIView و DestroyAPIView را ترکیب می کند.
می توانید نماهای قبلی خود را به شکل زیر تغییر دهید:
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import Recipe
from .serializers import RecipeSerializer
class RecipeListCreateAPIView(ListCreateAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
class RecipeRetrieveUpdateDeleteAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
این رویکرد مقدار کلی کد را کاهش می دهد.
میتوانید برای نماهای جدید URL ایجاد کنید:
from django.urls import path
from .views import RecipeListCreateAPIView, RecipeRetrieveUpdateDeleteAPIView
urlpatterns = [
# List and Create view
path('recipes/', RecipeListCreateAPIView.as_view(), name='recipe-list-create'),
# Retrieve, Update, and Delete view
path('recipes/<int:pk>/', RecipeRetrieveUpdateDeleteAPIView.as_view(), name='recipe-retrieve-update-destroy'),
]
می توانید این نقاط پایانی را با Postman یا هر ابزار تست API که ترجیح می دهید آزمایش کنید.
نماهای عمومی مبتنی بر کلاس کار شما را آسان تر می کند
همانطور که در بالا مشاهده شد، نماهای مبتنی بر کلاس عمومی می توانند روند ایجاد نماها را سرعت بخشند. اکنون فقط باید APIView مناسب را برای مورد استفاده خود به ارث ببرید.
همچنین باید مطمئن شوید که شیوه های برنامه نویسی خوبی را اتخاذ کرده اید، تا در نهایت کد بدی بنویسید.