-
Notifications
You must be signed in to change notification settings - Fork 2
Views
Views er todelt, en for autorisasjon, en for api.
Views er inndelt i hovedsaklig viewsets, som gjør om data fra databasen (SQL) til JSON og visa versa. Så og si hvert viewset har en serializer tilknyttet seg som håndterer dette. Django abstrakterer ganske mye av dette egt.
Django gjør ganske mye av jobben med views for oss. Under er litt forklaringer på det vi faktisk gjør.
| Navn | Forklaring |
|---|---|
| Serializers | Omgjør komplekse datatyper som QuerySets til native python datatyper og rendrer som JSON (i vårt tilfelle, kan også rendre som XML (og sikkert andre ting)) |
| ViewSets | kombinert logikk for en eller flere views i en class, f.eks. 'list', 'save' etc. etc. |
| Permission Classes | Returnerer enten true eller false for en spesifikk bruker av nettsiden vår. Hvis false får ikke den personen se viewsettet. Se mer info på Permissions-siden |
queryset = models.Job.objects.all()
Velger alle Job objekter
serializer_class = serializers.JobSerializer
Sier hvilken serializer som skal brukes
permission_classes = [IsFGOrReadOnly]
Sier hvilken permission class som skal brukes
queryset = models.User.objects.all().order_by('-date_joined')
Velger alle objekter fra User entiteten, legger dem i rekkefølge ettersom hvilken dato de ble med
serializer_class = serializers.UserSerializer
Sier hvilken serializer class som brukes
permission_classes = [IsFGOrReadOnly]
Sier hvilken permission class som skal brukes
serializer_class = serializers.UserSerializer
Sier hvilken serializer som skal brukes
pagination_class = UnlimitedPagination
Sier hvilken type pagination som brukes. I dette tilfelle er det en custom pagination class som gjør at det ikke blir pagination (altså at alt kommer på samme side, det går i dette tilfellet siden det ikke er så SJUKT mye data som skal hentes)
permission_classes = [IsFG]
Sier hvilken permission class som skal brukes
def get_queryset(self):
return models.User.objects.filter(groups__name="FG").all()
Henter ut alle brukere fra gruppen 'FG' (mer info om grupper finnes på siden 'Groups')
Akkuratt det samme som FgUsersView, men tar queryset med alle brukere fra gruppen 'POWER' istedenfor fra gruppen 'FG'
TL;DR: logger inn brukeren. Bruker 'Basic Authentication'
auth_header = request.META['HTTP_AUTHORIZATION']
encoded_credentials = auth_header.split(' ')[1]
decoded_credentials = base64.b64decode(encoded_credentials).decode("utf-8").split(':')
username = decoded_credentials[0]
password = decoded_credentials[1]
user = authenticate(username=username, password=password)
Henter auth detaljer fra HTTP metadata, og dekoder dataen til format som python vil ha Authentiserer en bruker med disse credentialsene. Authenticate returnerer ingenting hvis credentials ikke er riktig.
if user:
if user.is_active:
login(request, user)
groups = []
for g in user.groups.all():
groups.append(g.name)
return JsonResponse({"username": user.username, "groups": groups})
else:
return JsonResponse({"error": "User is inactive"}, status=403)
else:
sleep(1)
return JsonResponse({"error": "User with username/password not found"}, status=403)
Hvis brukeren finnes og ikke er innaktiv blir du logget inn, ellers får du en feilmelding (403)
Statistics = namedtuple(
'Statistics',
('photos', 'tags', 'scanned', 'albums', 'splash', 'orders', 'photos_by_year', 'photos_per_album')
)
SearchData = namedtuple(
'SearchData',
('motives',)
)
IDInfo = namedtuple(
'IDInfo',
('photo_ids',)
)
Metadata = namedtuple(
'Metadata',
('metadata',)
)
namedtuple er basically som vanlig tupler, men vi kan forhåndsdefinere hva som skal være i dem, som gjør det mer oversiktlig senere i koden.
Alle er veldig like og de ser også ut som viewsettene beskrevet over i fg_auth delen
permission_classes = [IsFGOrReadOnly]
serializer_class = None
pagination_class = UpgradedPageNumberPagination
Dette er likt som det vi har sett tidligere, men vi har valgt å ikke sette en default serializer, det gjør vi heller senere på hvert view (eller i hver metode dette ViewSettet har), siden vi trenger flere forskjellige serializers ettersom hvilke operasjoner vi skal utføre på querysettet vi tar inn her. Pagination class er en utvidet versjon av django restframework sin PageNumberPagination class. Mer om den finnes på 'Paginators'-siden.
filter_backends = (OrderingFilter, SearchFilter, DjangoFilterBackend)
ordering_fields = '__all__'
search_fields = ('motive', 'tags__name', 'album__name')
ordering = ('-date_taken',)
filter_class = filters.PhotoFilter