اگر در حال ساختن یک برنامه وب یا موبایل هستید ، احتمال دارد راهی برای ارسال و دریافت داده ها بین برنامه و سرور خود نیاز داشته باشید.

این جایی است که API های REST وارد می شوند. آنها به برنامه ها کمک می کنند تا با یکدیگر صحبت کنند – نوعی مانند یک پیشخدمت که سفارش شما را می گیرد و غذای شما را باز می گرداند. و اگر از Django استفاده می کنید ، در حال حاضر در نیمه راه هستید.

جنگو یکی از محبوب ترین چارچوب های وب در آنجا است. این سریع ، ایمن و بسته بندی شده با ابزارهای مفید است. آن را با چارچوب Django Rest (DRF) ترکیب کنید ، و شما همه چیز را برای ساختن یک API استراحت جامد بدون صرف هفته ها در اختیار شما قرار داده اید.

در این راهنما ، من شما را از طریق کل قدم می زنم process ساخت یک API استراحت در جنگو از ابتدا.

آنچه را پوشش خواهیم داد:

  1. API REST چیست؟

  2. ابزارهایی که لازم دارید

  3. روش ساخت API REST در جنگو

    • مرحله 1: پروژه Django خود را تنظیم کنید

    • مرحله 2: یک مدل ایجاد کنید

    • مرحله 3: یک سریال ساز درست کنید

    • مرحله 4: نماها را ایجاد کنید

    • مرحله 5: URL ها را تنظیم کنید

    • مرحله ششم: آن را آزمایش کنید!

  4. مجوزهای DRF

    • مجوزهای داخلی مشترک

    • مجوزهای سفارشی

    • ترکیب مجوزها

  5. متداول

  6. افکار نهایی

API REST چیست؟

قبل از شروع کار ، بیایید یک چیز را مستقیم بگیریم: حتی API استراحت چیست؟

یک API REST (کوتاه برای “انتقال وضعیت نمایندگی”) راهی برای دو سیستم – مانند یک وب سایت و سرور – با استفاده از روشهای استاندارد HTTP مانند GET ، POST ، PUT و DELETE است.

بیایید بگوییم که شما یک برنامه انجام دهید. شما می خواهید:

  • بدست آوردن لیستی از کارها

  • اضافه کردن یک کار جدید

  • بروزرسانی یک کار

  • حذف کردن یک کار

شما می توانید همه این کارها را از طریق API REST انجام دهید. این مانند تنظیم منوی دستوراتی است که برنامه های دیگر (یا جلوی شما) می توانند برای کار با داده های خود استفاده کنند.

ابزارهایی که لازم دارید:

در اینجا آنچه شما در این آموزش استفاده خواهید کرد:

  • پیتون (ترجیحاً 3.8+)

  • دژنگو (چارچوب وب)

  • چارچوب استراحت جنگو (DRF) (برای ساخت API)

  • پستچی یا فر (برای آزمایش)

می توانید DRF را با:

pip install djangorestframework

روش ساخت API REST در جنگو

در اینجا روش شروع کار آمده است:

مرحله 1: پروژه Django خود را تنظیم کنید

اگر قبلاً این کار را نکرده اید ، یک پروژه جدید Django را شروع کنید:

django-admin startproject myproject
cd myproject
python manage.py startapp api
  • django-admin startproject myproject – یک پروژه جدید Django به نام ایجاد می کند myproject، که شامل پرونده های پیکربندی برای کل سایت شما است.

  • cd myproject – به فهرست جدید پروژه خود بروید.

  • python manage.py startapp api – یک برنامه جدید Django به نام ایجاد می کند api جایی که مدل ها ، نماهای و منطق API شما زندگی می کنند.

اکنون اضافه کنید 'rest_framework' وت 'api' به شما INSTALLED_APPS در settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'api',
]
  • rest_framework چارچوب Django REST است – به شما ابزاری می دهد تا به راحتی API ها را ایجاد کنید.

  • 'api' به جنگو می گوید در api پوشه برای مدل ها ، نماها و غیره onبشر

مرحله 2: یک مدل ایجاد کنید

بیایید یک مدل ساده ایجاد کنیم – یک لیست کار.

در api/models.py:

from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=200)
    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title
  • title: یک متن کوتاه (مانند “خرید مواد غذایی”). CharField برای رشته ها استفاده می شود.

  • completed: یک بولی (درست یا نادرست) برای علامت گذاری در صورت انجام یک کار.

  • __str__: این روش خاص هنگام چاپ نسخه رشته ای از مدل را برمی گرداند – برای اشکال زدایی و پانل مدیر مفید است.

پیشنهاد می‌کنیم بخوانید:  روش استفاده از Git و GitHub - راهنمای مبتدیان و توسعه دهندگان با تجربه

سپس اجرا کنید:

python manage.py makemigrations
python manage.py migrate
  • makemigrations: تغییرات را در طرح پایگاه داده آماده می کند.

  • migrate: این تغییرات را در پایگاه داده واقعی اعمال می کند.

مرحله 3: یک سریال ساز درست کنید

Serializer مدل Django شما را به JSON (قالب داده مورد استفاده در API) و به عقب تبدیل می کند.

در api/serializers.py:

from rest_framework import serializers
from .models import Task

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'
  • سریال سازی تبدیل نمونه های مدل (مانند a Task) به و از json، بنابراین می توان آنها را از طریق وب ارسال کرد.

  • ModelSerializer میانبر است که به طور خودکار اکثر موارد مبتنی بر آن را کنترل می کند روی مدل شما

  • fields="__all__" معنی شامل هر زمینه در مدل (عنوان و تکمیل شده) است.

مرحله 4: نماها را ایجاد کنید

اینجاست که منطق می رود. می توانید از نماهای مبتنی بر کلاس یا عملکردی استفاده کنید. بیایید با استفاده از DRF با کلاس مبتنی بر کلاس برویم genericsبشر

در api/views.py:

from rest_framework import generics
from .models import Task
from .serializers import TaskSerializer

class TaskListCreate(generics.ListCreateAPIView):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

اینها هستند نماهای مبتنی بر کلاس عمومی ارائه شده توسط چارچوب Django Rest برای صرفه جویی در وقت شما.

  1. TaskListCreate:

    • دسته ها درخواست هایی را برای لیست همه کارها دریافت می کنند.

    • درخواست های ارسال را برای ایجاد کارهای جدید انجام می دهد.

  2. TaskDetail:

    • دسته ها برای یک کار ، برای به روزرسانی و حذف یک کار دریافت می کنند و برای حذف یک کار حذف می شوند

مرحله 5: URL ها را تنظیم کنید

اول ، درست کنید urls.py پرونده در api پوشه (اگر وجود نداشته باشد).

در api/urls.py:

from django.urls import path
from .views import TaskListCreate, TaskDetail

urlpatterns = [
    path('tasks/', TaskListCreate.as_view(), name='task-list'),
    path('tasks/<int:pk>/', TaskDetail.as_view(), name='task-detail'),
]
  • tasks/: مسیر دسترسی یا ایجاد وظایف.

  • tasks/<int:pk>/: مسیر دریافت ، به روزرسانی یا حذف یک کار واحد توسط کلید اصلی آن (pk).

سپس ، در اصلی خود myproject/urls.py:

حالا ، hook این به اصلی urls.py در پوشه پروژه خود:

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

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

مرحله ششم: آن را آزمایش کنید!

سرور را شروع کنید:

python manage.py runserver

Postman یا Curl را باز کنید و سعی کنید به این نقاط پایانی ضربه بزنید:

  • GET /api/tasks/ – همه کارها را دریافت کنید

  • POST /api/tasks/ – یک کار جدید ایجاد کنید

  • GET /api/tasks/1/ – یک کار خاص دریافت کنید

  • PUT /api/tasks/1/ – یک کار را به روز کنید

  • DELETE /api/tasks/1/ – یک کار را حذف کنید

و این همان است – شما یک API استراحت کار دارید.

این تنظیم به لطف چارچوب Django Rest ، فقط با چند خط کد API کاملاً کاربردی با چند خط کد به شما می دهد. اکنون باید درک کنید:

  • چگونه مدل ها ساختار پایگاه داده شما را تعریف می کنند

  • چگونه سریال ها مدل ها را به JSON تبدیل می کنند و برعکس

  • چگونه نمایش رفتار API را کنترل می کند (دریافت ، ارسال ، بروزرسانی ، حذف)

  • چگونه مسیریابی URL نظرات شما را به درخواست های وب متصل می کند

مجوزهای DRF

در حال حاضر ، هر کسی می تواند از API شما استفاده کند. اما اگر فقط می خواهید کاربران خاصی دسترسی داشته باشند ، چه می شود؟

DRF روشهای ساده ای برای رسیدگی به این کار به شما می دهد. به عنوان مثال ، برای ایجاد یک API فقط در دسترس کاربران وارد شده است:

from rest_framework.permissions import IsAuthenticated

class TaskListCreate(generics.ListCreateAPIView):
    ...
    permission_classes = [IsAuthenticated]

مجوزهای بیشتری وجود دارد که می توانید از آنها استفاده کنید. IsAdminUser به عنوان مثال مجوزهای سفارشی.

بیایید این را بشکنیم و عمیق تر شویم مجوزها در چارچوب استراحت Django (DRF) ، از جمله:

مجوزها در DRF چیست؟

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

پیشنهاد می‌کنیم بخوانید:  روش قالب‌بندی شماره به‌عنوان رشته ارز در جاوا اسکریپت، قالب‌بندی دستی یک عدد به‌عنوان رشته ارز می‌تواند خسته‌کننده باشد. process. اگرچه اغلب اوقات می توان این کار را در چند خط کد انجام داد، تمرین خوبی است که به جای اینکه خودتان آن را کد سختی کنید، از یک هنجار استاندارد شده پیروی کنید، به علاوه نوشتن آن برای توسعه دهنده بسیار آسان تر است.

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

مجوزهای داخلی مشترک

DRF چند کلاس مجوز داخلی فوق العاده مفید را از جعبه به شما می دهد:

1 IsAuthenticated

این یکی تضمین می کند که فقط کاربران وارد شده می توانند به نمای دسترسی پیدا کنند:

from rest_framework.permissions import IsAuthenticated

class TaskListCreate(generics.ListCreateAPIView):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    permission_classes = [IsAuthenticated]

فقط کاربرانی که تأیید شده اند (به عنوان مثال ، از طریق ورود به سیستم یا نشانه) قادر به لیست یا ایجاد وظایف هستند. هر کس دیگری یک 403 Forbidden پاسخ

2 IsAdminUser

فقط در صورتی امکان دسترسی را فراهم می کند user.is_staff است ، Trueبشر

from rest_framework.permissions import IsAdminUser

class AdminOnlyView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [IsAdminUser]

فقط کاربران مدیر (معمولاً از طریق Django Admin یا وضعیت Superuser تنظیم شده اند) می توانند به این دیدگاه دسترسی پیدا کنند.

3 AllowAny

اجازه می دهد همه کاربران ، حتی افراد غیرمجاز. این پیش فرض برای API های باز مانند صفحات ثبت نام است.

from rest_framework.permissions import AllowAny

class PublicSignupView(generics.CreateAPIView):
    serializer_class = SignupSerializer
    permission_classes = [AllowAny]

4 IsAuthenticatedOrReadOnly

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

from rest_framework.permissions import IsAuthenticatedOrReadOnly

class ArticleView(generics.RetrieveUpdateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

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

مجوزهای سفارشی

کنترل بیشتری می خواهید؟ می توانید مجوزهای خود را با زیر طبقه بندی ایجاد کنید BasePermissionبشر

مثال: فقط به صاحبان یک شی اجازه می دهد تا آن را ویرایش کنند

from rest_framework.permissions import BasePermission

class IsOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.owner == request.user

سپس از آن مانند این استفاده کنید:

class TaskDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    permission_classes = [IsAuthenticated, IsOwner]
  • اول ، یک کاربر باید وارد سیستم شود (IsAuthenticated).

  • سپس ، فقط صاحب آن خاص Task می توانید آن را مشاهده ، به روز کنید یا آن را حذف کنید.

ترکیب مجوزها

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

permission_classes = [IsAuthenticated, IsAdminUser]

این بدان معنی است: کاربر باید هم تأیید شده و هم مدیر.

TL ؛ دکتر

اجازه چه کسی دسترسی پیدا می کند؟
AllowAny همه (حتی کاربران ورود به سیستم)
IsAuthenticated فقط کاربران وارد شده
IsAdminUser فقط کاربران مدیر/کارمندان
IsAuthenticatedOrReadOnly بخوانید: همه / نوشتن: فقط کاربران وارد شده
Custom Permissions قوانین شما (به عنوان مثال ، فقط صاحبان)

متداول

آیا برای ساختن API در Django به چارچوب استراحت Django احتیاج دارم؟

از نظر فنی ، نه – اما DRF زندگی شما را بسیار ساده تر می کند. بدون DRF ، شما باید به صورت دستی مواردی مانند:

  • تجزیه و اعتبار درخواست JSON

  • نوشتن نماها برای سریال سازی اشیاء پایتون به JSON

  • مدیریت کدها و پاسخهای وضعیت HTTP

  • رسیدگی به احراز هویت و مجوزها روی خودت

به طور خلاصه ، شما می خواهید چرخ را دوباره اختراع کنید – اما DRF همه این کارها را با کد بسیار کمتری برای شما انجام می دهد.

آیا می توانم از این API با یک واکنش یا جبهه VUE استفاده کنم؟

کاملا Django API شما داده ها را با فرمت JSON ارسال و دریافت می کند – این دقیقاً همان چیزی است که چارچوب های مدرن جبهه مانند React و Vue برای کار با آنها طراحی شده اند. فقط اطمینان حاصل کنید که COR ها (به اشتراک گذاری منابع متقاطع) را به درستی اداره می کنید.

چگونه می توانم API خود را سریعتر کنم؟

شما می توانید:

  • استفاده کردن ذخیره سازی برای ذخیره پاسخ های مکرر

  • فعال کردن صفحه بندی برای کاهش بار داده

  • کاوش کردن نماهای async (Django 3.1+ از Async پشتیبانی می کند) برای I/O سریعتر
    DRF همچنین ابزارهای داخلی را برای پیج ، لرزش و ترفندهای عملکرد بیشتر از جعبه ارائه می دهد.

افکار نهایی

ساختن API REST در Django ممکن است مانند یک کار بزرگ به نظر برسد ، اما این فقط یک سری از مراحل کوچک و قابل کنترل است.

هنگامی که یک بار این کار را انجام دادید ، دفعه بعد آسان تر می شود. به علاوه ، استفاده از چارچوب Django Rest یک تن وقت صرفه جویی می کند – شما هر بار چرخ را دوباره اختراع نمی کنید.

منابع بیشتر

آیا می خواهید به یادگیری ادامه دهید؟ در اینجا چند مکان جامد برای حفر عمیق تر وجود دارد:

  • اسناد رسمی REST DJANGO REST

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

  • JWT ساده برای احراز هویت توکن

  • API خود را با پستچی آزمایش کنید

  • راهنمای واقعی Django API Python