Wprowadzenie.
Rejestracja nowego użytkownika w naszej bazie danych może odbywać się na kilka sposobów. Może zdarzyć się tak, że logika biznesowa aplikacji oraz API, z którego będą korzystały aplikacje, będzie wymagała, aby rejestrowania nowego użytkownika było możliwe przy pomocy API. Dlatego w tym wpisie przedstawię jak zrealizować jakie założenie.
Spis treści serii
- Django REST API cz. 1– Tworzenie nowego projektu
- Django REST API cz. 2 – ListAPIView
- Django REST API cz. 3 – Wbudowana strona logowania
- Django REST API cz. 4 – Widoki generyczne
- Django REST API cz. 5 – ListCreateAPIView i konfiguracja dostępu
- Django REST API cz. 6 – Uszczegóławianie odpowiedzi
- Django REST API cz. 7 – Określenie z góry wartości danych
- Django REST API cz. 8 – RetrieveDestroyAPIView
- Django REST API cz. 9 – RetrieveUpdateAPIView
- Django REST API cz. 10 – Nadpisywanie zachowań metod przed/po operacji zapisu/usuwania
- Django REST API cz. 11 – Rejestracja nowego użytkownika poprzez API ⇐
- Django REST API cz. 12 – Uwierzytelnianie przy pomocy Tokena
- Django REST API cz. 13 – Generowanie tokena dla istniejących użytkowników
Zakres artykułu.
- Rejestracja nowego użytkownika poprzez API
Rejestracja nowego użytkownika poprzez API
W pierwszym kroku w pliku serializers.py zaimportujmy model User, który dostarcza nam Django.
from django.contrib.auth.models import User
Teraz stwórzmy klasę nowego serializera, który będzie obsługiwał model User. W tym serializerze będziemy musieli dodać dodatkowe argumenty do pola password. Argumenty należy dodać przy pomocy zmiennej extra_kwargs. Zmienna extra_kwargs jest słownikiem i jak możemy przeczytać w dokumentacji stanowi skrót pozwalający na określenie dowolnych dodatkowych argumentów słów kluczowych dla pól. Oznacza to, że nie trzeba jawnie deklarować pola w serializerze. Następnie w tej klasie musimy jeszcze nadpisać metodę create(), która to definiują, w jaki sposób tworzone są pełnoprawne instancje podczas wywoływania funkcji. Warto jeszcze zwrócić uwagę na tworzenie samego hasła i zastosowanie do tego celu metody set_password(). Metoda set_password(raw_password) przyjmuje jako argument surowe, czyli niezahashowane hasło, które wprowadza użytkownik i te hasło hashuje. Dopiero po tej czynności jesteśmy w stanie wywołać metodę save().
Więcej o innych metodach, które zaimplementowane są dla modelu User, możemy przeczytać w dokumentacji.
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('username', 'password', 'email') extra_kwargs = { 'password': { 'write_only': True, 'style': {'input_type': 'password'} } } def create(self, validated_data): user = User(email=validated_data['email'], username=validated_data['username']) user.set_password(validated_data['password']) user.save() return user
Po stworzeniu serializera zaimportujmy go w pliku z widokami views.py.
from .serializers import AuthorSerializer, BookSerializer, BorrowSerializer, BorrowReturnBookSerializer, UserSerializer from rest_framework.permissions import IsAuthenticated, BasePermission, SAFE_METHODS, IsAdminUser, IsAuthenticatedOrReadOnly, AllowAny
W następnym kroku stwórzmy nową klasę widoku.
class UserCreate(generics.CreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = (AllowAny, )
Ostatnim krokiem jest stworzenie ścieżki url przy pomocy metody path path(‘api/user/create’, views.UserCreate.as_view()).
from django.contrib import admin from django.urls import path, include from restapiapp import views urlpatterns = [ path('admin/', admin.site.urls), # API path('api/authors/', views.AuthorList.as_view()), path('api/books/', views.BookList.as_view()), path('api/borrows/', views.BorrowList.as_view()), path('api/borrows/<int:pk>/', views.BorrowRetrieveDestroy.as_view()), path('api/borrows/<int:pk>/return/', views.BorrowReturnBookUpdate.as_view()), path('api/borrows/<int:pk>/edit/', views.BorrowRetrieveUpdate.as_view()), path('api/user/create', views.UserCreate.as_view()), # new # DRF path('api-auth/', include('rest_framework.urls')), ]
Przejdźmy teraz do przetestowania aplikacji. Wprowadźmy do przeglądarki adres 127.0.0.1:8000/api/user/create.
W formularzu wprowadźmy pola Username, Password oraz Email address.
Strona powinna zwrócić nam informację z naszymi danymi, to jest username oraz email, przy czym zgodnie z tym, co dopisaliśmy w dodatkowych argumentach, nie wyświetli nam się password, ponieważ pole to ustawiliśmy jedynie do zapisu.
Przejdźmy teraz do panelu administratora do tabeli, która zawiera naszych użytkowników. Sprawdźmy, czy baza ta zawiera nowo stworzonego użytkownik.
Jak możemy zobaczyć, w bazie danych znajduje się nowo stworzony użytkownik. Przejdźmy jeszcze do szczegółowych danych tego użytkownika.
Zgodnie z oczekiwaniami, mamy uzupełnione pola Username, Email address oraz zahashowane Password.
Jeszcze na koniec zalogujmy się jako nasz nowy użytkownik.
W prawym roku na pasku nawigacyjnym widzimy nasz username.
Spis treści serii
- Django REST API cz. 1– Tworzenie nowego projektu
- Django REST API cz. 2 – ListAPIView
- Django REST API cz. 3 – Wbudowana strona logowania
- Django REST API cz. 4 – Widoki generyczne
- Django REST API cz. 5 – ListCreateAPIView i konfiguracja dostępu
- Django REST API cz. 6 – Uszczegóławianie odpowiedzi
- Django REST API cz. 7 – Określenie z góry wartości danych
- Django REST API cz. 8 – RetrieveDestroyAPIView
- Django REST API cz. 9 – RetrieveUpdateAPIView
- Django REST API cz. 10 – Nadpisywanie zachowań metod przed/po operacji zapisu/usuwania
- Django REST API cz. 11 – Rejestracja nowego użytkownika poprzez API ⇐
- Django REST API cz. 12 – Uwierzytelnianie przy pomocy Tokena
- Django REST API cz. 13 – Generowanie tokena dla istniejących użytkowników
Witam,
Mam pytanie, tutaj nowego użytkownika może założyć każdy.
A jak zrobić aby tylko użytkownik zalogowany mógł zakładać nowych użytkowników?
Pozdrawiam
Cześć,
Chyba najprościej będzie zmodyfikować zmienną “permission_classes” w klasie widoku UserCreate i przypisać do niej listę [IsAuthenticated] –> permission_classes = [IsAuthenticated]. O ustawieniu dostępów napisałem trochę więcej w tym wpisie
https://inthou.pl/django-29-rest-api-cz-5-listcreateapiview-i-konfiguracja-dostepu/
i wydaje mi się że powinienieś znaleźć tu odpowiedź.
Pozdrawiam