1. Web api - Django

1.1. Stworzenie środowiska wirtualnego

python -m venv venv
source venv/bin/activate

1.2. Instalacja

pip install django
pip install djangorestframework # pamietaj o dodaniu 'rest_framework', do settings.py - INSTALLED_APPS
pip install django-extensions # pamietaj o dodaniu 'django_extensions', do settings.py - INSTALLED_APPS
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support - pamietaj o dodaniu do settings.py 'django_filters' - INSTALLED_APPS

1.3. Utworzenie pliku zależności

pip freeze > requirements.txt

1.4. Utworzenie nowego projektu

django-admin startproject servermonitoring
cd servermonitoring
python manage.py migrate
python manage.py runserver

1.5. Utworzenie nowej aplikacji

django-admin startapp api

1.6. Sprawdzenie w przeglądarce

  • Chrome/Postman pod adres http://127.0.0.1:8000/

  • Curl http://127.0.0.1:8000/

1.7. Dostosowanie ustawień

Tip

podejrzyj plik manage.py np. poprzez polecenie cat manage.py można tam znaleźć w jaki sposób django jest uruchamiane

zmień ustawienia w settings.py

vim servermonitoring/settings.py

Hint

można to zrobić np. poprzez uruchomienie vim servermonitoring/settings.py

albo bezpośredni w pyCharm

# servermonitoring/settings.py

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_filters',
 'django_extensions',
 'rest_framework',
 'api'
]

1.8. Utworzenie testów

# api/tests.py

from django.test import TestCase
from rest_framework import status

from api.models import Server

class ServerModelTestCase(TestCase):
    """Klasa testów modelu Server"""

    def setUp(self):
        """Definicja wartosci startowych"""

        self.server = Server(address='127.0.0.1')

    def test_model_repr(self):
        self.assertEqual("<Server address: 127.0.0.1>", repr(self.server))

    def test_model_str(self):
        self.assertEqual("Server o adresie: 127.0.0.1", str(self.server))

1.9. Odpalenie testu

python manage.py test

1.10. Tworzenie modeli

from django.db import models

class Server(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    location = models.CharField(max_length=100, null=True, blank=True, default='')
    available = models.BooleanField(default=False)
    address = models.GenericIPAddressField()
    admin_contact = models.EmailField(max_length=70, null=True, blank=True)
    admin_phone = models.CharField(max_length=70, null=True, blank=True, default='')

    def __repr__(self):
        return "<{} address: {}>".format(self.__class__.__name__, self.address)

    def __str__(self):
        return "{} o adresie: {}".format(self.__class__.__name__, self.address)

1.11. Utworzenie oraz uruchomienie migracji

python manage.py makemigrations
python manage.py migrate

1.12. Sprawdzenie kodu sql migracji

python manage.py sqlmigrate api 0001

1.13. Odpalenie testu po dodaniu modelu

python manage.py test

1.14. Dodanie testu widoku

# api/tests.py
# ............

from django.test import TestCase
from rest_framework import status
from api.models import Server
from django.urls import reverse

class ViewServerTestCase(TestCase):
    """Test dla widoku serwera"""

    def test_create_server(self):
        """Sprawdzimy czy mozna utworzyc serwer (post)"""

        url = reverse('servers')
        data = {"location": "office", "address": "127.0.0.1"}

        response = self.client.post(url, data, format="json")

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(len(response.data), 1)

    def test_view_server_list(self):
        """Sprawdzimy czy pobierze wlasciwa ilosc serverow"""

        url = reverse('servers')

        response = self.client.get(url, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

1.15. Serializer

# api/serializers.py

from rest_framework import serializers

from .models import Server

class ServerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Server
        fields = '__all__' # albo fields = ('location', 'address',)

1.16. Dodanie widoku

# api/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from .serializers import ServerSerializer
from .models import Server

class ServerList(APIView):
    """Lista serwerow"""

    serializer_class = ServerSerializer

    def get_queryset(self):
        queryset = Server.objects.all()
        location = self.request.query_params.get('location', None)

        if location is not None:
            queryset = queryset.filter(location__icontains=location)
        return queryset

    def get(self, request, format=None):

        servers = self.get_queryset()
        serializer = ServerSerializer(servers, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = ServerSerializer(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)

1.17. Dodanie urls

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

from api import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('servers/', views.ServerList.as_view(), name='servers')
]

1.18. Metody

  • Get

  • Post

  • Put

  • Delete

1.19. Kody HTTP

  • 200 - powodzenie. Request poprawy. Odpowiedź poprawna.

  • 400 - zły request. Źle sformuowany request / problemy z autentykacją.

  • 403 - dostęp zabroniony,

  • 404 - nie ma takiej strony,

  • 500 - błąd wewnętrzny serwera. Najczęściej gdy popełniliśmy jakiś błąd w kodzie np. w django.

1.20. Requesty

1.21. Odpowiedzi (response)

1.22. Settingsy

1.23. Widok

1.24. Migracja

Hint

Aby podejrzeć migracje można użyć: python manage.py showmigrations

1.25. Orm

1.26. Django extensions

python manage.py show_urls
python manage.py shell_plus # lepsza konsola - ipython
python manage.py runserver_plus # server

1.27. Zadania

1.27.1. Zero

  • Napraw test,

  • Dodaj do testu sprawdzanie daty - stworzenia wpisu

1.27.2. Pierwsze

  • Stworz 4 hosty - każdy w inny sposób

    • Przez stronę web,

    • Przez request z postmana,

  • Stwórz model, który:

    • Będzie przetrzymywał datę

1.27.3. Pierwsze

  • Stwórz endpoint (POST), który:

    • Będzie

1.27.4. Drugie