====== 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