====== Django REST Framework ====== * Instalacja pip install django djangorestframework drf-spectacular \\ * Utworzenie projektu i aplikacji django-admin startproject api cd api python manage.py startapp blinds \\ * Utworzenie modelu danych \\ ''blinds/models.py'' from django.db import models class Blind(models.Model): position = models.IntegerField(blank=False, default=0) runtime_up = models.IntegerField(blank=False) runtime_down = models.IntegerField(blank=False) pass_up = models.IntegerField(default=0) pass_down = models.IntegerField(default=0) calibrated = models.DateTimeField(blank=True, null=True) \\ * Dodanie aplikacji ''api/settings.py'' INSTALLED_APPS = [ ... 'rest_framework', 'blinds', ] \\ * Dodanie ustawień drf-spectacular ''api/settings.py'' INSTALLED_APPS = [ ... 'drf_spectacular', ] REST_FRAMEWORK = { 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', } SPECTACULAR_SETTINGS = { 'TITLE': 'Sases Smart Home API', 'DESCRIPTION': 'Dokumentacja API dla Sases Smart Home', 'VERSION': '1.0.0', } \\ * Inne ustawienia ''api/settings.py'' ALLOWED_HOSTS = ['192.168.1.248', '192.168.4.1', 'localhost', '127.0.0.1'] LANGUAGE_CODE = 'pl' TIME_ZONE = 'Europe/Warsaw' \\ * Migracje: python manage.py makemigrations python manage.py migrate \\ * Stworzenie serializera ''blinds/serializers.py'' from rest_framework import serializers from .models import Blind class BlindSerializer(serializers.ModelSerializer): class Meta: model = Blind fields = ['id', 'position', 'runtime_up', 'runtime_down', 'pass_up', 'pass_down', 'calibrated'] \\ * Stworzenie widoku ''views.py'' from django.shortcuts import render from rest_framework import generics from .models import Blind from .serializers import BlindSerializer class BlindsList(generics.ListAPIView): queryset = Blind.objects.all() serializer_class = BlindSerializer \\ * Dodanie opisu do dokumentacji ''views.py'' from drf_spectacular.utils import extend_schema @extend_schema( summary="Lista rolet wraz z ich parametrami", description="Zwraca listę wszystkich rolet z ich szczegółowymi informacjami.", responses={200: BlindSerializer(many=True)} ) class BlindsList(generics.ListAPIView): ... \\ * Utworzenie URL dla API ''api/urls.py'' from blinds import views urlpatterns = [ ... path('api/blinds', views.BlindsList.as_view()), ] \\ * Dodanie URLi dla ''drf-spectacular'' ''api/urls.py'' from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView urlpatterns = [ ... path('api/schema/', SpectacularAPIView.as_view(), name='schema'), path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), ] \\ * Dodanie modelu danych do panelu administracyjnego ''blinds/admin.py'' from .models import Blind admin.site.register(Blind) \\ * Utworzenie konta administratora python manage.py createsuperuser \\ * Uruchomienie serwera python manage.py runserver \\ \\ ===== Dodanie autoryzacji ===== * Instalacja pip install djangorestframework-simplejwt \\ * Dodanie konfiguracji \\ ''settings.py'' from datetime import timedelta INSTALLED_APPS = [ ... 'rest_framework_simplejwt', ... ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': False, 'BLACKLIST_AFTER_ROTATION': True, 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'VERIFYING_KEY': None, 'AUTH_HEADER_TYPES': ('Bearer',), 'USER_ID_FIELD': 'id', 'USER_ID_CLAIM': 'user_id', 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM': 'token_type', 'JTI_CLAIM': 'jti', } \\ * Dodanie URLi urls.py from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView urlpatterns = [ path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ... ] \\ * Zabezpieczenie widoków views.py from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions class BlindViewSet(viewsets.ModelViewSet): ... permission_classes = [IsAuthenticated, DjangoModelPermissions] \\ * Stworzyć użytkownika, który będzie miał dostęp tylko do API: * W ''Panelu administracyjnym'' stworzyć grupę użytkowników ''API Users'' i przypisać jej dostęp do modelu API. * Stworzyć użytkownika i przypisać go do grupy ''API Users''. \\ \\ ===== Przeniesienie na serwer linux ===== * Stworzyć bazę danych MariaDB wraz z użytkownikiem * Skopiować pliki * Dodać konfigurację bazy danych do Django settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'twoja_baza_danych', 'USER': 'twoj_uzytkownik', 'PASSWORD': 'twoje_haslo', 'HOST': 'localhost', 'PORT': '3306', } } \\ * Dodać IP/adres serwera do ''ALLOWED_HOSTS'' ''settings.py'' ALLOWED_HOSTS = ['192.168.1.123', 'sases.pl', 'localhost', '127.0.0.1'] \\ * Zainstalować biblioteki sudo apt install libmariadb-dev-compat libmariadb-dev pip install django djangorestframework drf-spectacular djangorestframework-simplejwt mysqlclient \\ * Przeprowadzić migracje bazy danych python manage.py migrate \\ * Utworzyć konto administratora oraz użytkownika API * Uruchomić serwer python manage.py runserver 0.0.0.0:8000 \\ * Sprawdzić działanie Django przez wpisanie w przeglądarce [[http://192.168.1.248:8000/]] * Dodać do [[linux:start#cron|crontab]] uruchamianie Django po uruchomieniu serwera @reboot python /var/www/django/manage.py runserver 0.0.0.0:8000 \\ * Utworzyć grupę użytkowników ''API Users'', przypisać jej dostęp oraz utworzyć użytkownika dla API