πŸ€” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Django Rest Framework: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

Django REST Framework (DRF) - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для создания Π²Π΅Π±-сСрвисов RESTful с использованиСм языка Python. Он прСдоставляСт мноТСство Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈ инструмСнтов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΈ создания API. DRF строится Π½Π° основС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для создания Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Но DRF добавляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π΅Π±-сСрвисы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DRF для создания простого API:

    from django.urls import path
    from rest_framework.views import APIView
    from rest_framework.response import Response

    class HelloWorldView(APIView):
        def get(self, request):
            data = {'message': 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!'}
            return Response(data)
        
    urlpatterns = [
        path('hello/', HelloWorldView.as_view()),
    ]
    
Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ создаСм класс `HelloWorldView`, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ `APIView`. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ `get` ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ простой JSON-ΠΎΡ‚Π²Π΅Ρ‚ с сообщСниСм "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!". Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ добавляСм URL-шаблон для этого Π²ΠΈΠ΄Π°. DRF Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСриализации ΠΈ дСсСриализации Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ запросов, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Он ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс создания API ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов, позволяя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅ своСго прилоТСния.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Django Rest Framework?

Django Rest Framework (DRF) - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнтарий для создания Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° основС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django. Он прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ RESTful API.

DRF обСспСчиваСт ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ стандартных HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ GET, POST, PUT, DELETE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΈ прСдоставлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON ΠΈΠ»ΠΈ XML. Он Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Π΄Π°Π½Π½Ρ‹Ρ….

Установка Django Rest Framework

Для установки DRF Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Django Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:


    pip install djangorestframework
    

ПослС установки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ DRF Π² список установлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ настроСк Django (settings.py):


    INSTALLED_APPS = [
        ...
        'rest_framework',
        ...
    ]
    

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСриализаторов

Одной ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ Π² DRF являСтся сСриализация Π΄Π°Π½Π½Ρ‹Ρ…. Serializer Π² DRF - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для прСобразования ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Django Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ JSON.

Для создания сСриализатора Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс, унаслСдованный ΠΎΡ‚ класса serializers.ModelSerializer. Π’ этом классС Π²Ρ‹ опрСдСляСтС поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сСриализованы, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡŽΠ±Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.


    from rest_framework import serializers
    
    class MyModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = ['field1', 'field2', 'field3']
    

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ прСдставлСний

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ (Views) Π² DRF ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΈ возвращСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы ΠΊΠ°ΠΊ классы ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Для создания классов прСдставлСний Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс, унаслСдованный ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса прСдставлСния DRF, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ APIView ΠΈΠ»ΠΈ ViewSet. Π’ этом классС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².


    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class MyView(APIView):
        def get(self, request):
            data = MyModel.objects.all()
            serializer = MyModelSerializer(data, many=True)
            return Response(serializer.data)
            
        def post(self, request):
            serializer = MyModelSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ URL-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²

Для доступа ΠΊ прСдставлСниям DRF Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ URL-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ прСдставлСниям.

Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ path ΠΈΠ»ΠΈ re_path Π² Ρ„Π°ΠΉΠ»Π΅ urls.py вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.


    from django.urls import path
    from .views import MyView
    
    urlpatterns = [
        path('myview/', MyView.as_view()),
    ]
    

ДокумСнтация с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Swagger

DRF прСдоставляСт ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с инструмСнтами автоматичСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Swagger. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Swagger Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ API.

Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ drf-yasg ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ URL-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ urls.py вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.


    pip install drf-yasg
    

    from django.urls import path, include
    from rest_framework import routers
    from .views import MyView
    
    router = routers.DefaultRouter()
    router.register('myview', MyViewSet)
    
    urlpatterns = [
        path('api/', include(router.urls)),
    ]
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ URL ваш_Π΄ΠΎΠΌΠ΅Π½/api/swagger, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Swagger для вашСго API.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Django Rest Framework - это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ RESTful API Π½Π° основС Django Π±ΠΎΠ»Π΅Π΅ простой ΠΈ эффСктивной. Он прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с запросами, сСриализациСй Π΄Π°Π½Π½Ρ‹Ρ…, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π‘ DRF Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ эффСктивныС ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅ Π²Π΅Π±-прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ.

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

#1. Django REST Framework - Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ | Π£Ρ€ΠΎΠΊΠΈ ΠΏΠΎ Django REST Framework

Django REST Framework - создаСм API для сайта

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ APIView ΠΈ ViewSet Π² Django REST framework?

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ€” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Django Rest Framework: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования