از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ایجاد یک REST API با چارچوب Django REST
سرفصلهای مطلب
معرفی
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 برای ما به صورت خودکار ایجاد شده است:
توجه داشته باشید: اگر پیغام خطایی با عنوان دریافت کردید “الگو پیدا نشد”، مطمئن شوید که وارد کرده اید 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