Skip to content
Mikkel94 edited this page Apr 24, 2018 · 2 revisions

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.

Forklaringer

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

fg_auth

JobViewSet extends viewsets.ModelViewSet

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

UserViewSet extends viewsets.ModelViewSet

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

FgUsersView extends ListAPIView

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')

PowerUsersView extends ListAPIView

Akkuratt det samme som FgUsersView, men tar queryset med alle brukere fra gruppen 'POWER' istedenfor fra gruppen 'FG'

login_user(request)

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)

api

namedtuple - hvorfor bruke dette
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.

TagViewSet, CategoryViewSet, MediaViewSet, AlbumViewSet, PlaceViewSet, SecurityLevelViewSet

Alle er veldig like og de ser også ut som viewsettene beskrevet over i fg_auth delen

PhotoViewSet extends ModelViewSet
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

Clone this wiki locally