API - extended

Programistyczny interfejs dostępu do notatek

23 stycznia 2017 22:00
Piotr Bajsarowicz
python api

Zanim zaczniesz

Czy wiesz czym jest API? Tak? Upewnij się tutaj.

Nie wiesz? Żaden problem - zaraz się to zmieni. Zapoznaj się z tym artykułem i wykonaj przygotowane ćwiczenia - https://pypila.stxnext.pl/blog/api/

Napiszmy własne API

Skorzystamy z podejścia REST.

Będziemy potrzebować:

  1. django.views.generic.base.View - do utworzenia API widoków. Klasa View dostarcza wygodny sposób obsługi zapytań HTTP.
  2. django.http.JsonResponse - do generowania odpowiedzi HTTP w formacie JSON (ważne - zwróć uwagę w jaki sposób można serializować listę).

Zrealizujemy endpoint, który pozwoli wysłać zapytanie o informacje dotyczące notatki o podanym w adresie id.

Stwórzmy plik api.py i zrealizujmy poniższy widok:

from django.views.generic import View
from django.http import Http404, JsonResponse

from notes.models import Note

...

load_initial_data()

...


class NoteApiView(View):

    @staticmethod
    def to_representation(note):
        return {
            'id': note.id,
            'board': note.board,
            'message': note.message,
        }

    def get(self, request, note_id):
        note = Note.objects.get(id=int(note_id))
        note_data = self.to_representation(note)

        return JsonResponse(note_data)

Teraz skojarzmy go z adresem URL dodając w pliku urls.py poniższą linię

url(r'^api/note/(?P<note_id>\d+)/$', api.NoteApiView.as_view(), name='api-note'),

Gotowe.

Aby przetestować skorzystaj z biblioteki requests (omawianej w artykule wprowadzającym), Postmana lub przejdź po prostu w przeglądarce na adres http://<host>:<port>/api/note/1. Powinieneś uzyskać podobny rezultat:

{"message": "Nauka API", "id": 1, "board": "in progress"}

Forbidden (403) - "CSRF verification failed. Request aborted."

Czy chciałbyś aby ktoś bez Twojej wiedzy spreparował zawartość np. formularza, którą chcesz przysłać do serwera? Nikt by tego nie chciał. Django domyślnie chroni nas przed tego typu atakiem. O samym Cross Site Request Forgery możecie przeczytać tutaj, a o tym jak mechanizm ochrony przed tym atakiem działa w Django tutaj.

Na potrzeby realizacji tego materiału możesz zakomentować 'django.middleware.csrf.CsrfViewMiddleware' w pliku settings.py.

"Is this the real life?"

Nie - tworzenie API na codzień wygląda trochę inaczej. Pisanie interfejsu aplikacji korzystając z generycznych widoków frameworka Django, bez zbudowania własnego frameworka do obsługi zapytań jest dosyć uciążliwe. Pójdźmy krok dalej - zbudowanie własnego API frameworka, szczególnie na początku nauki programowania, byłoby nie lada wyzwaniem. Na co dzień korzysta się z gotowych, sprawdzonych, otestowanych rozwiązań.

Zachęcamy do zapoznania się z Django Rest Framework.

Zadanie domowe

Zachęcamy do realizacji zadania domowego, które polega na napisaniu poniższych endpointów:

  • GET - /api/note/ - lista notatek,
  • POST - /api/note/ - nowa notatka,
  • GET - /api/note/:id - pojedyncza notatka,
  • PUT - /api/note/:id - aktualizacja notatki,
  • PATCH - /api/note/:id - aktualizacja notatki,
  • DELETE - /api/note/:id - usunięcie notatki.

Dodatkowo, w przypadku próby dostępu do notatki, która nie istnieje, należy obsłużyć taki przypadek zwracając poniższy komunikat z kodem odpowiedzi HTTP 404 (parametr status klasy JsonResponse).

{
    "message": "Notatka nie istnieje"
}

PS. Czym różni się PUT od PATCH? Dostrzegłeś różnicę? Która z nich jest idempotentna?

Zadania WYJĄTKOWO prosimy przesłać e-mailowo, wysyłając je na oba adresy: artur.grochowski@stxnext.pl, piotr.bajsarowicz@stxnext.pl

Pliki do przesłania:

  • api.py
  • urls.py

Tytuł maila: [PyPila3 API] Imię Nazwisko

Pytania?

Zapraszamy do zadawania pytań mailowo, na jeden z poniższych adresów:

  • artur.grochowski@stxnext.pl
  • piotr.bajsarowicz@stxnext.pl

Pamiętajcie, że Nie ma głupich pytań, są tylko głupie odpowiedzi.

Related pages

Comments