خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

یک CRUD REST API با نماهای کلاس محور در چارچوب Django REST بسازید

این راهنمای گام به گام را دنبال کنید و هسته یک CRUD API را خواهید داشت که می توانید بر اساس آن بیشتر بسازید.

Django Rest Framework (DRF) یک چارچوب جنگو است که از ساخت API های REST پشتیبانی می کند. مانند جنگو، DRF به شما امکان می دهد نماهای API خود را با نماهای مبتنی بر عملکرد یا کلاس بسازید.

اگرچه کار کردن با نماهای مبتنی بر کلاس در ابتدا ممکن است دشوار باشد، اما مزایایی مانند ساختار کد بهتر، قابلیت استفاده مجدد، وراثت و مختصر بودن را ارائه می دهند.

یک Recipe Manager API با چارچوب Django REST ایجاد کنید

یک برنامه مدیریت دستور غذا روشی عالی برای یادگیری نماهای مبتنی بر کلاس در DRF است. ویژگی هایی مانند افزودن، حذف و ویرایش دستور العمل ها به شما کمک می کند تا نحوه اجرای عملیات CRUD (ایجاد، خواندن، به روز رسانی، حذف) را درک کنید. مراحل زیر به شما یاد می دهد که چگونه یک CRUD API ایجاد کنید.

می توانید کد این راهنما را در GitHub پیدا کنید.

مرحله 1: چارچوب Django REST را نصب کرده و پروژه خود را پیکربندی کنید

  1. یک محیط مجازی برای پروژه خود ایجاد کنید و وابستگی های زیر را نصب کنید: pip install django djangorestframework
  2. با دستور زیر یک پروژه جنگو به نام core ایجاد کنید: django-admin startproject core.
  3. برنامه ای به نام recipe_manager ایجاد کنید: python manager.py startapp recipe_manager
  4. فایل 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',
]

مرحله 2: یک مدل برای برنامه دستور غذا ایجاد کنید

  1. فایل recipe_manager/models.py خود را باز کنید و یک مدل برای برنامه خود ایجاد کنید. در اینجا یک مثال اساسی از یک مدل دستور غذا آورده شده است: # models.pyfrom django.db import modelsclass Recipe(models.Model):    recipe_name = models.CharField(max_length=255)    ingredients = models.TextField()  (s) دستورالعمل‌های TextField()  (s)
  2. مهاجرت ایجاد کنید و مدل خود را با این دستور به پایگاه داده منتقل کنید: 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

مرحله 3: یک سریال ساز برای برنامه خود ایجاد کنید

سریال‌ساز یک جزء جنگو است که به شما کمک می‌کند انواع داده‌های پیچیده مانند مجموعه پرس و جو خود را به قالبی تبدیل کنید که بتوانید آن را مانند JSON یا XML و بالعکس تبدیل کنید.

مطلب مرتبط:   استفاده از AWS DynamoDB در یک برنامه Node.js

برای ایجاد سریال‌ساز، مراحل زیر را دنبال کنید:

  1. فایلی به نام recipe_manager/serializers.py ایجاد کنید.
  2. ماژول سریال‌سازها و همچنین مدلی را که می‌خواهید سریال‌سازی کنید وارد کنید: # serializers.pyfrom rest_framework import serializersfrom .models دستور # مدل برای سریال‌سازی را وارد کنید
  3. در همان فایل، یک کلاس سریال‌ساز برای مدل خود ایجاد کنید و کلاس 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__"

مرحله 4: یک 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 را به برنامه خود ارسال کنید.

مرحله 5: یک View برای عملیات READ بنویسید

  1. برای اجرای عملیات READ، ListAPIView را به view های خود وارد کنید. این نما به شما کمک می کند اشیاء مدل را فهرست کنید: # views.pyfrom rest_framework.generics import CreateAPIView, ListAPIView
  2. یک کلاس برای نماهای خود ایجاد کنید و سریال‌ساز و مجموعه پرس و جو را برای استفاده مشخص کنید: # List viewclass RecipeListView(ListAPIView):    serializer_class = RecipeSerializer    queryset = Recipe.objects.all()
  3. یک نما برای خواندن یک دستور پخت خاص ایجاد کنید. برای انجام این کار، به 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()

مرحله 6: برای عملیات 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()

مرحله 7: URL ها را برای برنامه خود ایجاد کنید

  1. این کد را به core/urls.py اضافه کنید تا URLهای خود را پیکربندی کنید: از مسیر واردات django.urls، includeurlpatterns = [    path(‘api/’, include(‘recipe_manager.urls’))]
  2. کد زیر را به فایل 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'),
]

مرحله 8: نقاط پایانی API خود را آزمایش کنید

از دایرکتوری پروژه خود، موارد زیر را اجرا کنید:

python manage.py runserver

این باید سرور شما را راه اندازی کند، برخی بررسی ها را انجام دهد و یک URL چاپ کند که می توانید از طریق آن به آن دسترسی داشته باشید.

اکنون می توانید با پیمایش به URL های مربوطه (به عنوان مثال /api/recipes/) و ارسال روش های درخواست HTTP برای عملیات CRUD، نقاط پایانی API خود را آزمایش کنید. شما باید یک رابط پیش فرض مانند این را ببینید:

رابط تست 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 مناسب را برای مورد استفاده خود به ارث ببرید.

همچنین باید مطمئن شوید که شیوه های برنامه نویسی خوبی را اتخاذ کرده اید، تا در نهایت کد بدی بنویسید.

مطلب مرتبط:   دستکاری زمان و تاریخ در برنامه های Go