Zadaniem jest zaprojektowanie API i wykonanie aplikacji do zapisywania, zwracania zapisanych oraz edycji krótkich tekstów (do 160 znaków).
- Wybrany framework: Django Rest Framework (dalej DRF)
- Zapisywanie wiadomości odbywa się w bazie danych SQLite (dalej BD) za pomocą Django ORM
- Odczytywanie wiadomości odbywa się za pomocą tzw. serializatorów, które konwertują dane z BD do Python'owych typów i odwrotnie
- Licznik wyświetleń wiadomości jest zaimplementowany jako atrybut w BD.
Uwaga: wszystkie punkty końcowe są wyświetlone w skróconym wariancie, w razie ręcznego wpisana linku, jako przedrostek musi być wiadomosci-api.herokuapp.com
Aby się nie pomylić ze wpisywaniem linku, zachęcam do korzystania z hiperłączy poniżej, które domyślnie prowadzą na zapytanie GET w postaci graficznego interfejsu, który udostępnia DRF.
- Na początku jest podana tablica z ogólnym opisem URL.
- Następnie jest opis każdego widoku.
Punkt końcowy | GET | POST | PUT | DELETE |
---|---|---|---|---|
/api/ | Dostać punkty końcowe | N/A | N/A | N/A |
/api/smses/ | Dostać wszystkie wiadomości | Utworzyć nową wiadomość | N/A | N/A |
/api/smses/<id>/ | Znaleźć wiadomość po ID | N/A | Nadpisać treść wiadomości | Skasować wiadomość |
/api/token/ | N/A | Uwierzytelnianie JWT | N/A | N/A |
/api/token/refresh/ | N/A | Dostać nowy token dostępu | N/A | N/A |
/api-auth/login | N/A | Uwierzytelnianie sesji | N/A | N/A |
Do przetestowania aplikacji podaję do dyspozycji dwa konta:
username:Jan
password:nowakhaslo
username:Zofia
password:nowakhaslo
Zaimplementowane rodzaje uwierzytelniania:
- Oparte na sesji:
- Dodane jako gotowe rozwiązanie w DRF
- Pozwala na szybkie i wygodne logowanie się w interfejsie (zachęcana metoda do skorzystania z aplikacji)
- URL logowania: /api-auth/login
- Oparte na tokenach (JWT)
-
Dodane jako dodatkowa funkcjonalność, ponieważ dodanie uwierzytelniania przez sesję nie zajęło dużego wysiłku :)
-
Dla logowania się, aby dostać token dostępu i odświeżania należy wysłać zapytanie POST na /api/token/ z JSON-em:
{ "username": "*username*", "password": "*password*" }
zatem jako odpowiedź dostaniemy parę tokenów (kluczy):
{ "refresh": "*długi napis, token odświeżania*", "access": "*długi napis, token dostępu*" }
Należy zachować te klucze, zatem przy kolejnym zapytaniu, które wymaga uwierzytelniania, koniecznie trzeba umieścić token dostępu w nagłówku HTTP jako:
Authorization: "Bearer <token dostępu>"
Token dostępu ma dość krótki czas istnienia, zatem, aby dostać nowy token dostępu, należy wykorzystać token odświeżania, który ma znacznie dłuższy czas życia.
-
Dla ponowienia tokena dostępu należy wysłać zapytanie POST na /api/token/refresh/ z JSON-em:
{ "refresh": "*długi napis, otrzymany wcześniej token odświeżania*" }
w wyniku dostaniemy nowy token dostępu w postaci tego samego JSON-a:
{ "access": "*długi napis, nowy token dostępu*" }
-
W wypadku wygaśnięcia tokena odświeżania należy ponownie zalogować się tak jak opisane powyżej, aby dostać nową parę tokenów.
-
Są dwa widoki dla wiadomości:
- Widok dla przeglądu wszystkich wiadomości, zaimplementowano jako dodatkowa
funkcjonalność dla kompletności rozwiązania. Należy wysłać zapytanie GET na /api/smses/
Odpowiedzią będzie JSON ze wszystkimi wiadomościami wraz z ich ID i autorem:
[
{
"id": 1,
"author": "Vadym",
"message": "Nowa wiadomość",
"views_count": 1
},
"..."
]
- Widok dla przeglądu specyficznej wiadomości. Należy wysłać zapytanie GET na /api/smses/<id>/,
gdzie '<id>' jest wartością ID dla specyficznej wiadomości.
Odpowiedzią będzie JSON z konkretną wiadomością razem z licznikiem wyświetleń:
{
"message": "Nowa wiadomość",
"views_count": 2
}
Aby utworzyć nową wiadomość, należy być zalogowanym, aby zatem wysłać uwierzytelnione zapytanie POST na /api/smses/ z JSON-em:
{
"message": "Najnowsza wiadomość"
}
Jako odpowiedź dostaniemy status HTTP 201 CREATED.
Aby zmienić treść wiadomości, tylko autor może wysłać uwierzytelnione zapytanie PUT na /api/smses/<id>/ z JSON-em:
{
"message": "Edytowana wiadomość"
}
Jako odpowiedź dostaniemy JSON z nową wiadomością:
{
"message": "Edytowana wiadomość",
"views_count": 0
}
Aby skasować wiadomość, tylko autor może wysłać uwierzytelnione zapytanie DELETE na /api/smses/<id>/
Jako odpowiedź dostaniemy status HTTP 200 OK
Napisałem 23 testy jednostkowe, pokrywające model wiadomości oraz wszystkie punkty końcowe (przy użyciu pakietu coverage). Uwzględniłem testowanie uwierzytelniania oraz wyzerowanie licznika wyświetleń po nadpisaniu treści wiadomości.
kliknij, aby przejść do folderu z testami
Jak można zrozumieć z URL, aplikacja była rozmieszczona na heroku.
Niestety czasami długo się ładuje strona, ale mam nadzieje, że to nie wpłynęło
na ogólne wrażenie rozwiązania zadania.
Gmail vmariiechko@gmail.com · GitHub @vmariiechko · LinkedIn @mariiechko