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

سرور مجازی NVMe

ایجاد یک REST API در پایتون با جنگو

0 61
زمان لازم برای مطالعه: 12 دقیقه


معرفی

جنگو یک چارچوب وب قدرتمند پایتون است که برای ساخت برنامه‌های وب امن و مقیاس‌پذیر به سرعت و با تلاش کمتر استفاده می‌شود. به دلیل محدودیت کم برای ورود و جامعه قوی که از چارچوب استفاده می کند و توسعه می دهد، محبوب شد.

در این راهنما، ما قصد داریم یک API RESTful را با استفاده از جنگو بسازیم بدون هیچ گونه کتابخانه خارجی. ما اصول جنگو را پوشش می دهیم و یک API مبتنی بر JSON را برای انجام عملیات CRUD برای یک برنامه سبد خرید پیاده سازی می کنیم.

REST API چیست؟

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

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

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

راه اندازی جنگو و برنامه ما

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

توجه داشته باشید: ما از Django نسخه 3.1 استفاده خواهیم کرد، زیرا این آخرین نسخه در زمان نگارش است.

قبل از نصب جنگو، برای اندازه گیری خوب و به نام جداسازی وابستگی ها – بیایید یک محیط مجازی بسازیم:

$ python3 -m venv env

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

در ویندوز:

$ env\scripts\activate

در مک یا لینوکس:

$ . env/bin/activate

حالا بیایید جلو برویم و از طریق Django را نصب کنیم pip:

$ pip install django

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

این django-admin ابزار به ما اجازه می دهد تا یک پروژه خالی و اسکلت را بچرخانیم که بتوانیم شروع به کار کنیم روی بلافاصله. مستقیما. همراه با خود جنگو ارائه می شود، بنابراین نیازی به نصب بیشتر نیست.

بیایید پروژه را با فراخوانی ابزار و همچنین شروع کنیم startproject دستور و به دنبال آن نام پروژه:

$ django-admin startproject shopping_cart

این یک پروژه اسکلت ساده در دایرکتوری کاری ایجاد می کند. هر پروژه جنگو می تواند شامل چندین مورد باشد برنامه ها – با این حال، ما یکی را می سازیم. بیا تماس بگیریم روی را manage.py فایل، ایجاد شده از طریق startproject دستور چرخش یک برنامه:

$ cd shopping_cart
$ python manage.py startapp api_app

پس از ایجاد، ساختار پروژه ما چیزی در امتداد خطوط زیر به نظر می رسد:

> env
> shopping_cart
  > api_app
    > migrations
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py
  > shopping_cart
    __init__.py
    asgi.py
    settings.py
    urls.py
    wsgi.py
  manage.py

سطح بالا shopping_cart جنگو است root فهرست راهنما و نام را با نام پروژه به اشتراک می گذارد. این root دایرکتوری پل بین فریم ورک و خود پروژه است و شامل چندین کلاس راه اندازی مانند manage.py که برای چرخش برنامه ها استفاده می شود.

این api_app برنامه‌ای است که ما در حال توسعه آن هستیم، و می‌تواند در اینجا تعداد زیادی وجود داشته باشد. هر کدام دارای چند اسکریپت پیش‌فرض است که ما آن‌ها را تغییر می‌دهیم تا برای عملکرد CRUD مطابقت داشته باشند.

سطح پایین shopping-cart هست دایرکتوری پروژه، که حاوی فایل های مرتبط با تنظیمات مانند settings.py که تمام ویژگی های برنامه ما را در خود جای می دهد.

جنگو یک Model-View-Controller (MVC). این یک الگوی طراحی است که یک برنامه کاربردی را به سه جزء تقسیم می کند: مدل که داده های ذخیره شده و تعامل با آنها را تعریف می کند چشم انداز که روش ارائه داده ها به کاربر را توضیح می دهد کنترل کننده که به عنوان واسطه بین مدل و نما عمل می کند. با این حال، تفسیر جنگو از این الگو کمی با تفسیر استاندارد متفاوت است. برای مثال، در یک چارچوب استاندارد MVC، منطقی که درخواست‌های HTTP را برای مدیریت اقلام سبد خرید پردازش می‌کند، در کنترل‌کننده وجود دارد.

در جنگو، این منطق در فایل حاوی وجود دارد دیدگاه ها. می توانید در مورد تفسیر آنها بیشتر بخوانید اینجا. درک مفهوم اصلی MVC و همچنین تفسیر جنگو، درک ساختار این برنامه را آسان‌تر می‌کند.

هر پروژه جنگو با چند برنامه (ماژول) جنگو از پیش نصب شده است. اینها برای احراز هویت، مجوز، جلسات و غیره استفاده می شوند. برای اینکه جنگو بداند که مایلیم برنامه خود را نیز اضافه کنیم، api_app، ما باید آن را در فهرست قرار دهیم INSTALLED_APPS فهرست

بیایید آن را با رفتن به فهرست فهرست کنیم settings.py فایل و اصلاح لیست برای شامل برنامه خودمان:

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

وقتی لیست شد، ما هستیم انجام شده با راه اندازی پروژه اگرچه، ما با پایه ها تمام نشده ایم روی که برنامه ما ساخته خواهد شد. قبل از توسعه عملکرد CRUD، ما به یک نیاز داریم مدل به عنوان ساختار داده پایه ما با آن کار کنیم.

توجه داشته باشید: شروع یک پروژه جنگو، به طور پیش فرض، یک پایگاه داده SQLite را نیز برای آن پروژه آماده می کند. شما اصلاً نیازی به تنظیم آن ندارید – فقط تعریف مدل ها و فراخوانی توابع CRUD مربوطه باعث شروع یک process زیر کاپوت که همه کارها را برای شما انجام می دهد.

تعریف یک مدل

بیایید با یک مدل ساده و ابتدایی شروع کنیم 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()

در اینجا، ما از داخلی استفاده می کنیم db ماژول، که دارای یک models بسته در آن این Model کلاس نشان دهنده، خوب، a مدل. دارای زمینه های مختلفی از جمله CharField، IntegerFieldو غیره که برای تعریف استفاده می شوند طرحواره مدل در پایگاه داده زمانی که می‌خواهید نمونه‌ای از یک مدل را در پایگاه داده ذخیره کنید، اینها در زیر هود توسط ORM جنگو نگاشت می‌شوند.

فیلدهای مختلفی وجود دارد، و آنها طوری طراحی شده اند که با پایگاه داده های رابطه ای به خوبی کار کنند، که ما در اینجا نیز این کار را انجام خواهیم داد. با این حال، برای پایگاه های داده غیررابطه ای، به دلیل تفاوت ذاتی در روش ذخیره داده ها، خیلی خوب کار نمی کند.

اگر می خواهید با یک پایگاه داده غیرمرتبط مانند MongoDB کار کنید – راهنمای ما برای استفاده از موتور جنگو MongoDB را بررسی کنید.

برای ایجاد تغییرات در طرحواره های مدل، مانند کاری که اخیرا انجام دادیم، باید تماس بگیریم روی مهاجرت جنگو. انجام مهاجرت‌ها بسیار آسان است، هرچند، هر بار که می‌خواهید تغییری در طرحواره ادامه دهید، باید آن‌ها را اجرا کنید.

برای انجام این کار، ما تماس می گیریم روی را manage.py فایل، و ارسال کنید makemigrations و migrate استدلال ها:

$ python manage.py makemigrations  
$ python manage.py migrate  

این migrate عملیات باید به چیزی شبیه به این منجر شود:

Operations to perform:
  Apply all migrations: admin, api_app, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying api_app.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

اگر انتقال‌های شما با موفقیت انجام نشد، لطفاً قبل از ادامه مراحل قبلی را مرور کنید تا مطمئن شوید که به درستی تنظیم شده‌اید.

سایت مدیریت جنگو

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

این admin ماژول از django.contrib بسته ای است که به ما امکان سفارشی سازی را می دهد مدیریت سایت.

برای استفاده از مدیریت فرم‌سازی خودکار و مدل‌سازی جنگو، باید این کار را انجام دهیم ثبت نام مدل ما در admin.site.

برویم به api_app/admin.py و مدل ما را ثبت کنید:

from django.contrib import admin
from .models import CartItem

admin.site.register(CartItem)

اکنون، ما می خواهیم کاربری ایجاد کنیم که بتواند به این داشبورد دسترسی داشته باشد و از آن استفاده کند. بیایید یک حساب “super admin” ایجاد کنیم و تأیید کنیم که همه این تغییرات با موفقیت انجام شده است:

$ python manage.py createsuperuser

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

Username (leave blank to use 'xxx'): naazneen
Email address:
Password:
Password (again):
Superuser created successfully.

در نهایت، بیایید برنامه خود را اجرا کنیم تا ببینیم آیا کارها همانطور که در نظر گرفته شده است کار می کنند:

$ python manage.py runserver

برنامه شروع شده است روی ما localhost (127.0.0.1) روی بندر 8000 به صورت پیش فرض. بیایید یک مرورگر را به آن هدایت کنیم http://127.0.0.1:8000/admin:

مدیر page پس از راه اندازی موفق جنگو

اکنون که مدل های اپلیکیشن و پایگاه داده ما راه اندازی شده اند، بیایید تمرکز کنیم روی توسعه REST API

ایجاد یک REST API در جنگو

برنامه جنگو آماده است – تنظیمات تعریف شده است، برنامه ما آماده شده است، مدل در جای خود قرار دارد و ما یک کاربر مدیر ایجاد کرده ایم تا تأیید کند که مدل در داشبورد مدیریت ثبت شده است.

اکنون، بیایید عملکرد CRUD را برای مدل خود پیاده سازی کنیم.

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

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

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

برای افزودن یک نما، ما آن را تغییر می دهیم api_app_views.py فایل، و اضافه کنید post() روشی که a POST درخواست. بدنه درخواست ورودی را در فرهنگ لغت می نویسد و a ایجاد می کند CartItem شی، حفظ آن در پایگاه داده:

from django.views import View
from django.http import JsonResponse
import json
from .models import CartItem

class ShoppingCart(View):
    def post(self, request):

        data = json.loads(request.body.decode("utf-8"))
        p_name = data.get('product_name')
        p_price = data.get('product_price')
        p_quantity = data.get('product_quantity')

        product_data = {
            'product_name': p_name,
            'product_price': p_price,
            'product_quantity': p_quantity,
        }

        cart_item = CartItem.objects.create(**product_data)

        data = {
            "message": f"New item added to Cart with id: {cart_item.id}"
        }
        return JsonResponse(data, status=201)

با استفاده از json ماژول، بدن درخواست ورودی را در شیئی که می‌توانیم با آن کار کنیم، رمزگشایی و تجزیه کرده‌ایم، و سپس آن داده‌ها را در متغیرها استخراج کرده‌ایم. p_name، p_price و p_quantity.

در نهایت، ما یک را ایجاد کرده ایم product_data فرهنگ لغت برای نگه داشتن زمینه های ما و ارزش های آنها، و ادامه داد CartItem به پایگاه داده ما، از طریق create() روش از Model کلاس، پر کردن آن با ما product_data.

به استفاده از JsonResponse کلاس در پایان ما از این کلاس برای تبدیل فرهنگ لغت پایتون به یک شیء معتبر JSON استفاده می کنیم که از طریق HTTP به مشتری ارسال می شود. ما کد وضعیت را روی 201 تنظیم کردیم تا به معنای ایجاد منبع باشد روی پایان سرور

اگر برنامه خود را اجرا می کردیم و سعی می کردیم به این نقطه پایانی ضربه بزنیم، جنگو با یک خطای امنیتی درخواست را رد می کرد. به طور پیش فرض، جنگو یک لایه حفاظتی برای آن اضافه می کند حملات جعل درخواست بین سایتی (CSRF).. در عمل، This Token در کوکی های مرورگر ما ذخیره می شود و با هر درخواستی که به سرور ارسال می شود، ارسال می شود. از آنجایی که این API بدون مرورگر یا کوکی ها استفاده می شود، درخواست ها هرگز نشانه CSRF نخواهند داشت. بنابراین، باید به جنگو بگوییم که این روش POST نیازی به توکن CSRF ندارد.

ما می توانیم با اضافه کردن یک دکوراتور به آن دست پیدا کنیم dispatch متد کلاس ما که مقدار را تنظیم می کند csrf_exempt به True:

...
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt

@method_decorator(csrf_exempt, name='dispatch')
class ShoppingCart(View):

    def post(self, request):
        data = json.loads(request.body.decode("utf-8"))
        ...

اکنون، مدل‌هایی داریم که داده‌های ما را ذخیره می‌کنند، و نمایی که می‌تواند یک آیتم سبد خرید جدید را از طریق یک درخواست HTTP ایجاد کند. تنها کاری که باید انجام دهید این است که به جنگو بگویید چگونه با URL ها و کنترل کننده های مربوطه آنها رفتار کند. برای هر URL قابل دسترسی، یک نقشه نمای کافی خواهیم داشت که آن را مدیریت می کند.

نوشتن URL های مربوطه در هر برنامه و سپس نوشتن یک تمرین خوب در نظر گرفته می شود آنها را شامل شود به پروژه urls.py به جای داشتن همه آنها روی سطح بالا از ابتدا.

بیایید با اصلاح پروژه شروع کنیم urls.py، در shopping_cart فهرست راهنما:

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

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

حتما import را include کتابخانه از django.urls، به طور پیش فرض وارد نشده است.

آرگومان اول مسیر رشته است و دومی جایی است که URL ها را از آن دریافت می کنیم. با بودن مسیر ما ''، یا خالی است، به این معنی است که URL های API ما خواهد بود root مسیر از برنامه وب.

اکنون باید نقاط پایانی برنامه API خود را اضافه کنیم urls.py. در api_app پوشه، ما یک فایل جدید به نام ایجاد می کنیم urls.py:

from django.urls import path
from .views import ShoppingCart

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

مشابه پروژه خود urls.pyآرگومان اول مسیر فرعی است که در آن نماهای ما قابل دسترسی هستند و آرگومان دوم خود نماها هستند.

در نهایت می توانیم برنامه را اجرا کنیم. مانند قبل، ما از آن استفاده خواهیم کرد manage.py فایل، و عبور در runserver بحث و جدل:

$ python manage.py runserver

بیایید a را باز کنیم terminal و ارسال کنید POST درخواست به نقطه پایانی ما در اینجا می توانید از هر ابزاری استفاده کنید – از ابزارهای پیشرفته تر مانند Postman گرفته تا ابزارهای ساده مبتنی بر CLI مانند curl:

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

اگر همه چیز به خوبی کار کند، با یک پیام خوشامد می‌گویید:

{
    "message": "New item added to Cart with id: 1"
}

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

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

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

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

بیایید اصلاح کنیم ShoppingCart چشم انداز:

...
@method_decorator(csrf_exempt, name='dispatch')
class ShoppingCart(View):

    def post(self, request):
        ...

    def get(self, request):
        items_count = CartItem.objects.count()
        items = CartItem.objects.all()

        items_data = ()
        for item in items:
            items_data.append({
                'product_name': item.product_name,
                'product_price': item.product_price,
                'product_quantity': item.product_quantity,
            })

        data = {
            'items': items_data,
            'count': items_count,
        }

        return JsonResponse(data)

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

بیایید بفرستیم GET درخواست به نقطه پایانی ما:

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

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

{
    "items": (
        {
            "product_name": "name",
            "product_price": 41.0,
            "product_quantity": 1
        },
    ),
    "count": 1
}

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

ما می‌توانیم از طریق API خود ادامه دهیم و داده‌ها را بازیابی کنیم، هرچند، به همان اندازه مهم است که بتوانیم به روز رسانی موجودیت هایی که از قبل تداوم یافته اند. این PATCH و PUT درخواست ها در اینجا وارد عمل می شوند.

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

در شرایطی که PUT، اگر زمینه منبع داده شده وجود نداشته باشد، آن را ایجاد می کند. برای انجام یک PATCH درخواست، منبع باید از قبل وجود داشته باشد. برای این برنامه، ما فقط می‌خواهیم یک منبع را در صورتی به‌روزرسانی کنیم که قبلاً وجود داشته باشد، بنابراین از a استفاده می‌کنیم PATCH درخواست.

این post() و get() هر دو روش در یک قرار دارند ShoppingCart مشاهده کلاس این به این دلیل است که آنها بیش از یک کالای سبد خرید را تحت تأثیر قرار می دهند.

آ PATCH درخواست فقط تاثیر می گذارد یکی کالای سبد خرید بنابراین ما یک کلاس جدید ایجاد خواهیم کرد که حاوی این دیدگاه و همچنین آینده باشد delete() روش. بیایید یک را اضافه کنیم PATCH رسیدگی کننده درخواست به api_app/views.py:

...
@method_decorator(csrf_exempt, name='dispatch')
class ShoppingCartUpdate(View):

    def patch(self, request, item_id):
        data = json.loads(request.body.decode("utf-8"))
        item = CartItem.objects.get(id=item_id)
        item.product_quantity = data('product_quantity')
        item.save()

        data = {
            'message': f'Item {item_id} has been updated'
        }

        return JsonResponse(data)

ما مورد را با یک شناسه معین بازیابی می کنیم و قبل از ذخیره مجدد آن را اصلاح می کنیم.

از آنجایی که نمی‌خواهیم مشتری بتواند قیمت یا نام محصول را تغییر دهد، فقط مقدار کالای موجود در سبد خرید را در اندازه متغیر می‌کنیم. سپس، ما با آن تماس می گیریم save() روشی برای به روز رسانی موجودیت موجود در پایگاه داده.

اکنون، باید برای این نیز یک نقطه پایانی ثبت کنیم، درست مانند کاری که برای آن انجام دادیم cart-items/ نقطه پایانی:

api_app/urls.py:

from django.urls import path
from .views import ShoppingCart, ShoppingCartUpdate


urlpatterns = (
    path('cart-items/', ShoppingCart.as_view()),
    path('update-item/<int:item_id>', ShoppingCartUpdate.as_view()),
)

این بار، ما نه تنها متکی هستیم روی فعل HTTP آخرین بار، ارسال یک POST درخواست به /cart-items منجر به post() متد در حال فراخوانی، در حین ارسال a GET درخواست منجر به get() روش در حال اجرا

در اینجا، ما یک متغیر URL را اضافه می کنیم – /<int:item_id>. این یک مؤلفه پویا در URL است که به آدرس نگاشت شده است item_id متغیر از دید مستقر روی مقدار ارائه شده، مورد مناسب از پایگاه داده بازیابی می شود.

بیایید بفرستیم PATCH درخواست به http:127.0.0.1:8000/update-item/1 با داده های مناسب:

$ curl -X PATCH http://127.0.0.1:8000/update-item/1 -d "{\"product_quantity\":\"3\"}"

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

{
    "message": "Item 1 has been updated"
}

بیایید این را از طریق پنل مدیریت در آدرس زیر نیز تأیید کنیم: http://127.0.0.1:8000/admin/api_app/cartitem/1/change/.

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

در نهایت، آخرین قطعه از عملکرد CRUD – حذف نهادها.

برای حذف کالا از سبد خرید، از همان استفاده خواهیم کرد ShoppingCartUpdate کلاس زیرا فقط یک مورد را تحت تأثیر قرار می دهد. را اضافه خواهیم کرد delete() روشی برای آن که شناسه موردی را که می‌خواهیم حذف کنیم را می‌گیرد.

مشابه روش ما save() مورد را هنگام به روز رسانی آن با مقادیر جدید، می توانیم استفاده کنیم delete() برای حذف آن بیایید اضافه کنیم delete() روش به api_app/views.py:

...
@method_decorator(csrf_exempt, name='dispatch')
class ShoppingCartUpdate(View):

    def patch(self, request, item_id):
        ...

    def delete(self, request, item_id):
        item = CartItem.objects.get(id=item_id)
        item.delete()

        data = {
            'message': f'Item {item_id} has been deleted'
        }

        return JsonResponse(data)

و اکنون، بیایید ارسال کنیم DELETE درخواست کنید و شناسه موردی را که می‌خواهیم حذف کنیم ارائه کنید:

$ curl -X "DELETE" http://127.0.0.1:8000/update-item/1

و ما پاسخ زیر را دریافت خواهیم کرد:

{
    "message": "Item 1 has been deleted"
}

بازدید http://127.0.0.1:8000/admin/api_app/cartitem/ تأیید می کند که مورد دیگر وجود ندارد.

نتیجه

در این راهنمای کوتاه، به آن پرداختیم روش ایجاد یک REST API در پایتون با جنگو. ما برخی از اصول جنگو را بررسی کرده‌ایم، یک پروژه جدید و یک برنامه در آن راه‌اندازی کرده‌ایم، مدل‌های لازم را تعریف کرده‌ایم و عملکرد CRUD را پیاده‌سازی کرده‌ایم.

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

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



منتشر شده در 1403-01-11 01:25:03

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

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

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