وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

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

0 9
زمان لازم برای مطالعه: 13 دقیقه


معرفی

REST APIها یک روش استاندارد صنعتی برای سرویس های وب برای ارسال و دریافت داده ها هستند. آنها از روش های درخواست HTTP برای تسهیل چرخه درخواست-پاسخ استفاده می کنند و معمولاً داده ها را با استفاده از JSON و به ندرت – HTML، XML و فرمت های دیگر انتقال می دهند.

در این راهنما، یک REST API در پایتون با جنگو با استفاده از چارچوب جنگو REST برای ایجاد یک برنامه سبد خرید

توجه داشته باشید: کد کامل این اپلیکیشن را می توانید پیدا کنید روی GitHub.

REST API چیست؟

REST (انتقال دولتی نمایندگی) یک معماری استاندارد برای ساخت و برقراری ارتباط با خدمات وب است. به طور معمول منابع را الزامی می کند روی وب در قالب متنی (مانند JSON، HTML یا XML) نمایش داده می شود و می توان با مجموعه ای از عملیات از پیش تعیین شده به آن دسترسی پیدا کرد یا تغییر داد. با توجه به اینکه ما معمولاً APIهای REST را برای استفاده از HTTP به جای پروتکل‌های دیگر می‌سازیم، این عملیات با روش‌های HTTP مانند GET، POST یا PUT مطابقت دارد.

یک API (رابط برنامه نویسی کاربردی)همانطور که از نام آن پیداست، رابطی است که تعامل بین اجزای مختلف نرم افزار را تعریف می کند. API های وب تعیین می کنند که چه درخواست هایی را می توان به یک مؤلفه (به عنوان مثال، نقطه پایانی برای دریافت لیستی از اقلام سبد خرید)، روش ایجاد آنها (مثلاً درخواست GET) و پاسخ های مورد انتظار آنها را تعیین می کند.

در این راهنما، ما این دو مفهوم را برای ساختن ترکیب می کنیم REST(full) API، یک API که با محدودیت های سبک معماری REST مطابقت دارد، با استفاده از چارچوب جنگو REST.

چارچوب Django REST چیست؟

این چارچوب Django REST (DRF) یک بسته ساخته شده است روی بالای جنگو برای ایجاد API های وب. یکی از قابل توجه ترین ویژگی های جنگو آن است نگاشت رابطه ای شی (ORM) که تعامل با پایگاه داده را به روش پایتونیک تسهیل می کند.

با این حال، ما نمی‌توانیم اشیاء پایتون را از طریق شبکه بفرستیم و از این رو به مکانیزمی برای ترجمه مدل‌های جنگو در قالب‌های دیگر مانند JSON، XML و بالعکس نیاز داریم. این گاهی اوقات چالش برانگیز است process، همچنین به نام سریال سازی، با چارچوب Django REST بسیار آسان شده است.

توجه داشته باشید: شایان ذکر است تفاوت بین ایجاد یک REST API با جانگو خود، و با جانگو REST.

شما می توانید برنامه های وب کلاسیک را از طریق جنگو ایجاد کنید و عملکرد آنها را از طریق API های REST در معرض دید جهانیان قرار دهید. در واقع ، این کار بسیار آسان است! اگرچه چارچوب Django REST برای این کار تخصصی تر است، ساخته شده است روی بالای جنگو دشت و می سازد process آسان تر.

اگر دوست دارید بخوانید روی روش ایجاد API های REST با چارچوب اصلی جنگو – راهنمای ایجاد API های REST در پایتون با جنگو را بخوانید.

تنظیم Django و برنامه ما

جنگو برای توسعه سریع اپلیکیشن (RAD) پروژه ها. اجازه دهید به سرعت یک پروژه Django را راه اندازی کنید:

بیایید با مقداردهی اولیه یک محیط مجازی، به خاطر سازماندهی وابستگی ها و اثرات آنها، شروع کنیم روی سایر وابستگی ها و فعال کردن آن:

$ mkdir drf_tutorial
$ cd drf_tutorial
$ python3 -m venv env
$ env\scripts\activate  
$ . env/bin/activate  

برای بیشتر روی virtualenv، محیط مجازی پایتون ما توضیح داده شده را بخوانید!

یا، اگر می‌خواهید در مورد جایگزین‌های virtualenv مطالعه کنید، راهنمای ما برای مدیریت محیط‌های پایتون با direnv و pyenv را بخوانید!

سپس، می‌توانیم جنگو و چارچوب جنگو REST را در آن محیط نصب کنیم:

$ pip install django
$ pip install djangorestframework

سرانجام ، ما می توانیم یک پروژه و برنامه به نام ایجاد کنیم api_app:

$ django-admin startproject shopping_cart
$ cd shopping_cart 
$ python3 manage.py startapp api_app

پس از ایجاد برنامه، باید در آن ثبت شود settings.py فایل. بیایید آن را در کنار برخی از برنامه های کاربردی داخلی مانند admin و auth که عملکرد مدیریت و پشتیبانی ساده احراز هویت را تسهیل می کند.

فایل زیر را باز کنید shopping_cart\settings.py و اضافه کنید api_app دایرکتوری که ما در آن ایجاد کرده ایم INSTALLED_APPS فهرست همچنین، بیایید اضافه کنیم rest_framework در لیست قرار دارد تا جنگو بداند که از آن استفاده خواهیم کرد چارچوب جنگو REST (DRF از این به بعد):

...
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api_app',
)

پس از ثبت نام، می‌توانیم مهاجرت را اعمال کنیم (پایگاه داده را راه‌اندازی کنیم) و یک ابرکاربر ایجاد کنیم تا مراقب باشیم. روی پایگاه داده:

$ python3 manage.py migrate  
$ python3 manage.py createsuperuser 

با وجود یک ابرکاربر و ثبت برنامه، می توانیم سرور را برای پذیرش درخواست ها راه اندازی کنیم! این کار به راحتی از طریق runserver فرمان، از درون manage.py:

$ python3 manage.py runserver

این process تولید، راه‌اندازی و پیکربندی یک برنامه وب جنگو و همچنین اجزای اصلی برنامه‌های تحت وب جنگو (تعریف مدل‌ها، ثبت مدل‌ها، رابط مدیریت جنگو، و غیره) با جزئیات بیشتری در ما پوشش داده شده است. راهنمای Core Django REST API.

ایجاد یک REST API در جنگو با استفاده از DRF

برنامه جنگو آماده است، و ما می توانیم توسعه مدل دامنه، پایداری و منطق تجاری را شروع کنیم.

مدل دامنه

بیایید یک مدل ساده ایجاد کنیم، CartItem، برای نشان دادن یک کالای سبد خرید آنلاین یا بهتر است بگوییم یک محصول است. در api_app/models.py فایل، مدل خود را تعریف می کنیم:

from django.db import models

class CartItem(models.Model):
    product_name = models.CharField(max_length=200)
    product_price = models.FloatField()
    product_quantity = models.PositiveIntegerField()

پس از تعریف، مدل خود را در جنگو ثبت می کنیم تا بتوانیم از پنل مدیریت به آن دسترسی داشته باشیم. رفتن به api_app/admin.py و خطوط زیر را اضافه کنید:

from django.contrib import admin
from .models import CartItem

admin.site.register(CartItem)

هنگامی که یک مدل جدید تعریف شد، باید آن را انجام دهیم makemigrations برای اینکه مدل ما در پایگاه داده منعکس شود. از خط فرمان خود، موارد زیر را اجرا کنید:

$ python3 manage.py makemigrations
$ python3 manage.py migrate

مدل آماده استفاده است! برنامه های وب اغلب داده های مدل را از یک سر به سر دیگر منتقل می کنند. طبیعتا وقت آن رسیده که کاربردی ترین ویژگی DRF یعنی سریال سازها را پیاده سازی کنیم!

سریال سازها نمایش مدل خود را در قالب JSON تعریف کنید و نمونه های شی را به قالب قابل انتقال تر تبدیل کنید. این تجزیه و تحلیل داده ها را برای API ما ساده می کند. Deserializers برعکس عمل کنید – آنها داده های JSON را به عنوان نمونه های شی به مدل های ما تبدیل می کنند.

قبل از ارسال پاسخ، از یک سریال ساز برای تبدیل شی مدل خود به JSON استفاده می کنیم. و هنگامی که یک درخواست JSON دریافت می کنیم، سریال ساز ما آن را به شی مدل تبدیل می کند. CartItem در این مورد.

بیایید a ایجاد کنیم serializers.py فایل در api_app پوشه کنید و a بنویسید ModelSerializer برای مدل ما:

from rest_framework import serializers
from .models import CartItem

class CartItemSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(max_length=200)
    product_price = serializers.FloatField()
    product_quantity = serializers.IntegerField(required=False, default=1)

    class Meta:
        model = CartItem
        fields = ('__all__')

در models.py فایل را تنظیم کرده ایم product_quantity ویژگی مدل ما به عنوان یک فیلد الزامی است. این اطمینان حاصل می کند که در هنگام ذخیره یک شی همیشه وجود دارد.

با این حال، زمانی که کاربر آن را مشخص نکرده است product_quantity – یک فرض پیش فرض معقول این است که آنها می خواهند یک کالا را خریداری کنند. API نباید در این مورد خطا ایجاد کند و تنظیم شود product_quantity به 1 به صورت پیش فرض.

سریال ساز این سناریو را به خوبی اداره می کند، بدون اینکه نیازی به نوشتن چنین منطقی در آن باشد. views.py. شما به سادگی می توانید اعتبار سنجی و سایر محدودیت های مورد نیاز را به ویژگی کلاس سریال ساز اضافه کنید.

به صورت پیش فرض، required برای هر فیلد تنظیم شده است True. از این رو، سریال ساز تا زمانی که آنها را دریافت نکند ادامه نخواهد داد.

این APIView کلاس

مانند جنگوی خالص، DRF هم نماهای مبتنی بر کلاس و هم نماهای مبتنی بر عملکرد را برای API امکان پذیر می کند.

در این راهنما، ما از دیدگاه‌های مبتنی بر کلاس حمایت می‌کنیم.

ما استفاده خواهیم کرد APIView کلاس برای نمایش دیدگاه ها، که زیر کلاس جنگو است View کلاس به این ترتیب ما بوت استرپ می شویم post()، get()، patch() و delete() روش هایی که می توانیم برای انجام بدون زحمت عملیات CRUD استفاده کنیم روی ما CartItem مدل، بدون نیاز به دستکاری در لایه persistence اصلا!

توجه داشته باشید: در حالی که تفویض تمام منطق زیربنایی به یک فریمورک جذاب است، شایان ذکر است که احتمالاً در آینده با این لایه به صورت دستی کار خواهید کرد و درک صحیح پایگاه‌های داده بسیار تشویق می‌شود.

این get()، post()، patch() و delete() روش ها را می توان همزمان با روش های مدل استفاده کرد، مانند all()، save() و delete() برای تسهیل عملکرد CRUD برای یک برنامه.

ما CartItemViews کلاس، که نمایانگر نمای گسترش خواهد یافت APIView:

class CartItemViews(APIView):
...

ایجاد موجودات – پست رسیدگی کننده درخواست

آ POST درخواست برای ارسال داده ها به سرور محصور شده در بدنه درخواست استفاده می شود. زمانی که می خواهید موجودیت های جدیدی ایجاد کنید از آن استفاده می شود. بیایید به دیدگاه های خود سر بزنیم و الف ایجاد کنیم POST درخواست کنترل کننده برای ما CartItem مدل.

بیایید به سمت api_app/views.py، یک کلاس جدید با a ایجاد کنید post() روشی که a را دریافت خواهد کرد POST درخواست بدنه، اعتبارسنجی آن و ایجاد یک شی از کلاس CartItem در DB ما:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import CartItemSerializer
from .models import CartItem

class CartItemViews(APIView):
    def post(self, request):
        serializer = CartItemSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
        else:
            return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

در اینجا می توانید مشاهده کنید که ابتدا یک a را ایجاد کردیم serializer شیء از request.data با استفاده از CartItemSerializer ما قبلا ایجاد کرده ایم. این is_valid() عملکرد بازگشت Boolean مقداری که نشان می دهد آیا می توان از بدنه درخواست برای ایجاد a استفاده کرد CartItem هدف – شی. و save() متد یک نمونه جدید از CartItem.

این Response باید با داده هایی که باید برگردانده شوند مقداردهی اولیه شود. این داده می تواند نمونه ای از هر نوع شی پایتون باشد bool، str، dict و غیره.

سایر پارامترهای اختیاری عبارتند از status که کد پاسخ HTTP را تنظیم می کند، content-type این نشان می دهد که چگونه data ارائه خواهد شد ، template_name این می تواند استفاده شود اگر HTMLRenderer انتخاب شده است و headers اگر به صراحت بخواهیم هدرهای خاصی را در پاسخ HTTP ارسال کنیم.

بیایید یک نقطه پایانی را برای استفاده از ما تنظیم و در معرض دید قرار دهیم post() روش. ما این کار را با ویرایش انجام می دهیم shopping_cart/urls.py و از جمله نقاط پایانی در معرض برنامه ما:

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

urlpatterns = (
    path('admin/', admin.site.urls),
    path('api/', include('api_app.urls')),
)

با نمایان شدن نقطه پایانی، ما می خواهیم واقعی را ثبت کنیم CartItemViews کلاس به عنوان یک نمای برای کاربر. توجه داشته باشید که این شامل الف نمی شود چشم انداز به معنای یک رابط کاربری گرافیکی – این کنترل کننده درخواست است.

ما گنجانده شده است api_app.urls در اینجا، و منطقی را که نما را به urls.py اسکریپت در api_app. در api_app پوشه، یک فایل جدید به نام ایجاد کنید urls.py، و پیوند دهید cart-items/ مکان یاب با CartItemViews کلاس:

from django.urls import path
from .views import CartItemViews

urlpatterns = (
    path('cart-items/', CartItemViews.as_view())
)

اولین استدلال از path() مسیر فرعی است که در آن نماهای ما قابل دسترسی است و آرگومان دوم نام کلاسی است که در آن ایجاد کردیم views.py به process درخواست ما.

در حال اجرا سرور

بیایید برنامه را اجرا کنیم و از نقطه پایانی خود استفاده کنیم /api/cart-items/:

$ python3 manage.py runserver

با این کار سرور محلی در شروع می شود http://127.0.0.1:8000/.

در یکی دیگر terminal، یک را بفرستیم POST درخواست به نقطه پایانی ما با برخی داده ها:

$ curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"1\"}"

View درخواست دریافتی را پردازش می کند و با داده های محصول پاسخ می دهد، و همچنین a status:

{
    "status": "success",
    "data": {
        "id": 21,
        "product_name": "name",
        "product_price": 41.0,
        "product_quantity": 1
    }
}

سریال‌ساز داده‌های JSON را می‌پذیرد، آن‌ها را به یک شی بتن تبدیل می‌کند و سپس سریال می کند آن را دوباره، برای بازگشت یک پاسخ.

شما می توانید بازدید کنید http://127.0.0.1:8000/admin/api_app/cartitem/ و موردی را که ما به تازگی اضافه کرده ایم پیدا خواهید کرد.

شما هم باید بازدید کنید http://127.0.0.1:8000/api/cart-items/ و یکی دیگر از ویژگی های قابل توجه DRF را خواهید دید، یک API قابل مرور

توجه داشته باشید که ما هیچ HTML ایجاد نکردیم page مرتبط با نما است، اما DRF برای ما به صورت خودکار ایجاد شده است:

API قابل مرور وب DRF پس از ایجاد نقطه پایانی

توجه داشته باشید: اگر پیغام خطایی با عنوان دریافت کردید “الگو پیدا نشد”، مطمئن شوید که وارد کرده اید rest_framework در INSTALLED_APPS آرایه ای از shopping_cart/settings.py.

می گوید که GET روش است مجاز نیست چون ما a ایجاد نکرده ایم GET کنترل کننده برای ما CartItemViews هنوز. اما یک فیلد ورودی وجود دارد که به شما امکان ارسال یک را می دهد POST با این وجود درخواست به نقطه پایانی.

درخواست اعتبارسنجی داده ها

اگر شخصی داده های نامعتبر را وارد کند چه اتفاقی می افتد؟ به عنوان مثال، یک رشته برای product_quantity مشخصه، که بدیهی است با نوع داده مورد انتظار مطابقت ندارد؟

بیایید سعی کنیم یک درخواست نامعتبر به نقطه پایانی ارسال کنیم api/cart-items:

$ curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"One\"}"

این منجر به پاسخ می شود:

{
    "status": "error",
    "data": {
        "product_quantity": (
            "A valid integer is required."
        )
    }
}

خطا به زیبایی با استفاده از نشان داده می شود serializer.errors – و از ما خواسته می شود که یک مقدار معتبر برای آن وارد کنیم product_quantity صفت. مدل می‌داند چه انتظاری دارد، و ما نوع اشتباهی را ارائه کرده‌ایم.

این یکی از ویژگی های شگفت انگیز DRF است – اعتبار سنجی خودکار داده ها. به خصوص برای بوت استرپ یا نمونه سازی، این شما را از آزاردهنده های اغلب اوقات نجات می دهد process اعتبار سنجی برای ورودی های ساده با این حال، می توانید قوانین اعتبار سنجی سفارشی را نیز از طریق تعریف کنید اعتبار سنجی سفارشی.

اگر می‌خواهید درباره اعتباردهنده‌ها بیشتر بخوانید – ما را بخوانید راهنمای اعتبار سنجی جنگو (به زودی!)

بازیابی موجودیت ها – کنترل کننده درخواست GET

اکنون که با موفقیت یک مورد را به سبد خرید اضافه کردیم، بیایید منطق بازیابی آن موجودیت را در کنار هر موجودیت دیگری که ممکن است در یک سبد خرید باشد، تعریف کنیم.

دو روش معمول برای بازیابی منابع وجود دارد:

  • ما می توانیم یک GET درخواست فهرست کردن همه نهادهای مرتبط به یک سبد خرید
  • ما می توانیم یک موجودیت خاص را با عبور دادن آن از سبد خرید خود بازیابی کنیم id به عنوان پارامتر URL

می‌توانیم یک شی خاص را از مدل دریافت کنیم و داده‌های آن را با استفاده از آن سریال کنیم CartItemSerializer. به طور مشابه، ما همچنین می توانیم تمام اشیاء مدل خود را دریافت کرده و داده های آنها را سریال کنیم.

رویکرد اخیر مستلزم یک استدلال اضافی است، many، همچنین تصویب می شود:

serializer = CartItemSerializer(items, many=True)

اجازه دهید GET یک شی با توجه به آن idو همه موارد دیگر در آن سبد خرید اگر را id ارائه نشده است، با اصلاح api_app/views.py فایل:

...
class CartItemViews(APIView):
    ...

    def get(self, request, id=None):
        if id:
            item = CartItem.objects.get(id=id)
            serializer = CartItemSerializer(item)
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)

        items = CartItem.objects.all()
        serializer = CartItemSerializer(items, many=True)
        return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)

اگر اختیاری است id آرگومان حذف شده است، درخواست برمی گردد همه از اقلام سبد خرید به جای یک مورد خاص و در هر دو مورد – الف Response به مشتری اجازه می دهد تا از روش انجام درخواست و تزریق داده های سریالی مطلع شود.

بیایید به نقطه پایانی خود برسیم api/cart-items/ با یک GET درخواست:

$ curl -X GET http://127.0.0.1:8000/api/cart-items/

این نتایج را به صورت زیر دریافت می کند:

{
    "status": "success",
    "data": (
        {
            "id": 1,
            "product_name": "name",
            "product_price": 41.0,
            "product_quantity": 1
        }
    )
}

همانطور که می بینید، CartItemSerializer(items, many=True) داده های سریالی را در قالب JSON برگردانده است – لیستی از اشیاء. متناوبا، ما می توانیم عرضه کنیم id استدلال از طریق URL – مانند api/cart-items/1/. هنگامی که یک نقطه پایانی را با URL متغیری مانند این ثبت می کنیم – DRF به طور خودکار متغیرهای مسیر را به آرگومان های درخواست ما گره می زند.

بیایید اکنون برنامه را اصلاح کنیم urls.py و مسیر را اضافه کنید – cart-items/<int:id>، که به کلاس ما اشاره می کند CartItemViews هم.

در این مرحله، api_app/urls.py به این شکل خواهد بود:

from django.urls import path
from .views import CartItemViews

urlpatterns = (
    path('cart-items', CartItemViews.as_view()),
    path('cart-items/<int:id>', CartItemViews.as_view())
)

در حال حاضر، زمانی که ما ضربه api/cart-items/1 نقطه پایانی، متغیر 1 حل می شود به id استدلال از get() روش:

$ curl -X GET http://127.0.0.1:8000/api/cart-items/1

این منجر به پاسخ زیر می شود:

{
    "status": "success",
    "data": {
        "id": 1,
        "product_name": "name",
        "product_price": 41.0,
        "product_quantity": 1
    }
}

در اینجا می توانید آن را مشاهده کنید CartItemSerializer(item) را برگردانده است CartItem داده های نمونه به عنوان یک شی JSON واحد به جای آرایه، زیرا انتظار می رود تنها یک منبع برگردانده شود.

به روز رسانی موجودیت ها – مدیریت کننده درخواست PATCH

اکنون می‌توانیم مواردی را از سبد خرید اضافه و بازیابی کنیم و بنابراین مستقیماً وضعیت سبد خرید را تغییر داده و مشاهده می‌کنیم. اکنون، ما به یک نقطه پایانی برای به‌روزرسانی کالای موجود در سبد خرید نیاز داریم، مانند افزایش مقدار، زیرا چه کسی چیزهای بیشتری نمی‌خواهد؟!

به منظور به روز رسانی اشیاء، می توانیم استفاده کنیم POST درخواست ها، هدف قرار دادن یک معین id. سپس، می‌توانیم آن شی را بازیابی کنیم، آن را به‌روزرسانی کنیم و در همان قسمت ذخیره کنیم id – تداوم تغییر

با این حال، شما معمولا استفاده نخواهید کرد POST درخواست برای این – حتی اگر شما می توانید. برای جدا کردن ایجاد و به روز رسانی منطق – ما استفاده می کنیم PATCH درخواست به، خوب، وصله منابع موجود و آنها را تغییر دهید.

این APIView کلاس در اختیار ما قرار می دهد patch() تابع – که دسته PATCH داده ها را درخواست و به روز می کند.

بازگشت دوباره به api_app/views.py برای اضافه کردن کنترل کننده درخواست PATCH به شرح زیر:

...
class CartItemViews(APIView):
    ...    
    def patch(self, request, id=None):
        item = CartItem.objects.get(id=id)
        serializer = CartItemSerializer(item, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response({"status": "success", "data": serializer.data})
        else:
            return Response({"status": "error", "data": serializer.errors})

به این خط دقت کنید:

serializer = CartItemSerializer(item, data=request.data, partial=True)

در اینجا ما سه آرگومان را به سریال ساز خود منتقل می کنیم.

  • نمونه از CartItem مدلی که می خواهیم به روز کنیم.
  • داده های دریافت شده از درخواست
  • partial=True برای نشان دادن اینکه این ممکن است شامل تمام فیلدهای مدل ما نباشد CartItem.

از آنجایی که باید در یک نمونه واقعی عبور کنیم، باید از آن استفاده کنیم get() تابع برای بازیابی یک منبع و سپس آن را به روز کنید.

توجه داشته باشید: هنگام بازیابی یک منبع برای به روز رسانی، بهتر است منطق اعتبارسنجی را انجام دهید تا از وجود منبع در وهله اول مطمئن شوید.

و همانطور که در حال به‌روزرسانی هستیم، سریال‌ساز خود را تأیید کرده و سپس آن را ذخیره می‌کنیم. زمان ارسال درخواست PATCH در api/cart-items/1 و به روز رسانی مورد:

$ curl -X PATCH http://127.0.0.1:8000/api/cart-items/1 -H 'Content-Type: application/json' -d '{"product_quantity":6}'

این نتیجه در:

{
    "status": "success",
    "data": {
        "id": 1,
        "product_name": "name",
        "product_price": 41.0,
        "product_quantity": 6
    }
}

پاسخ یک مقدار به روز شده را نشان داد. همچنین می توانید بازدید کنید http://127.0.0.1:8000/admin/api_app/cartitem/1/change/ و خواهید دید که با موفقیت به روز شده است.

حذف نهادها – DELETE Request Handler

ما معمولاً اضافه می‌کنیم، اضافه می‌کنیم، اضافه می‌کنیم و سپس به یاد می‌آوریم که می‌خواهیم چند اقلام را به عنوان هدیه بخریم – تا زمانی که بخش صورت‌حساب برسد. بررسی واقعیت معمولاً ما را وادار می کند چند چیز را از سبد خرید حذف کنیم واقعا نیازی نیستو منطق خود را مجددا ارزیابی کنیم.

یک کاربر باید بتواند موارد خاصی را از یک سبد خرید حذف کند – اگر به طور تصادفی آن را اضافه کند یا به سادگی نظر خود را تغییر دهد.

برای حذف یک مورد از سبد خرید، اجازه دهید delete() تابع، عبور در id از شیئی که می خواهیم حذف کنیم. سپس، تماس delete() روی خود مدل، ما می توانیم آن را از ماندگاری حذف کنیم.

ما برای این منظور نیازی به استفاده از سریال‌ساز نداریم، زیرا هیچ تبدیلی بین داده‌ها و اشیاء مشخص وجود ندارد. به جای انجام دادن CartItem.objects.get() ما می توانیم استفاده کنیم get_object_or_404() تابعی که به طور خودکار a را برمی گرداند 404 پاسخ زمانی که شی با داده شده است id وجود ندارد – زیرا ما هیچ اطلاعاتی را برنمی گردیم روی خود موجودی حذف شده است.

به این ترتیب – ما می دانیم که آیا موجودی وجود دارد (بازنگشت 404) یا نه، بدون نیاز به سریال سازی و ارسال آن به عنوان پاسخ.

برگردیم به api_app/views.py و اضافه کنید delete() روش:

...
from django.shortcuts import get_object_or_404

class CartItemViews(APIView):
    ...
    def delete(self, request, id=None):
        item = get_object_or_404(CartItem, id=id)
        item.delete()
        return Response({"status": "success", "data": "Item Deleted"})

جدید را از دست ندهید import بیانیه! بعد از اینکه شیء را گرفتیم ، آن را صدا کردیم delete() متد آن را از پایگاه داده حذف می کند.

بیایید سعی کنیم مورد را از سبد خرید ما حذف کنیم:

$ curl -X "DELETE" http://127.0.0.1:8000/api/cart-items/1

اگر مورد موجود باشد، تابع باید پاسخ زیر را برگرداند:

{
    "status": "success",
    "data": "Item Deleted"
}

هنگامی که مورد موجود نباشد، پاسخ به این صورت خواهد بود:

{
    "detail": "Not found."
}

شما می توانید بازدید کنید http://127.0.0.1:8000/admin/api_app/cartitem/ و مورد دیگر در آنجا وجود ندارد. همچنین می توانید بازدید کنید http://127.0.0.1:8000/api/cart-items/ برای دسترسی به API قابل مرور وب که با تمام عملیات CRUD ایجاد کرده اید!

نتیجه

این آموزش نشان داد که چگونه می‌توانیم یک API RESTful در جنگو با استفاده از چارچوب Django REST بسازیم. ما یک پروژه Django ایجاد کردیم و یک api_app کاربرد برای آن سپس یک را ایجاد کردیم CartItem مدل و CartItemSerializer برای رسیدگی به سریال سازی و سریال زدایی از مدل ما.

ما یک نمای کلاس را اضافه کردیم CartItemView برای انجام عملیات CRUD روی مدل ما ما یک مورد را با استفاده از سبد خرید اضافه کردیم post(). ما همه موارد و یک مورد خاص را با استفاده از آن واکشی کردیم get(). ما هم ایجاد کردیم patch() برای به روز رسانی موارد ما و delete() برای حذف یک مورد از سبد خرید.

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

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-08 19:24:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید