Een kleine nieuwsgierigheid over Django's view-functie en verborgen principes

Ontwikkelaars schrijven vaak uit gewoonte code. Ook ik gebruikte vaak request.GET.get('variable') of request.POST.get('variable') bij het schrijven van view-functies in Django, zonder enige twijfel. Maar op een dag kwam er plots een vraag in me op.

"Hoe werkt dit eigenlijk?"


De verwerking van verzoeken in Django: De geheimen van request.GET en request.POST

Om een antwoord op deze vraag te vinden, heb ik de werking van Django bestudeerd. Om met de conclusie te beginnen: request.GET en request.POST zijn eigenschappen van een HTTP-verzoek object dat het verzonden verzoek van de client gemakkelijker te verwerken maakt.

Django parset de gegevens die de client naar de server heeft verzonden en zet deze om in een vorm die als een dictionary behandeld kan worden. Daarom kunnen we eenvoudigweg de gewenste gegevens ophalen met request.GET.get('variable') of request.POST.get('variable').

Echter, de belangrijke feit is dat dit object geen echte dictionary is. Wat betekent dan de uitdrukking als een dictionary?


QueryDict: Een object dat op een dictionary lijkt, maar meer is dan dat

In Django zijn request.GET en request.POST in werkelijkheid instanties van de klasse QueryDict. Deze klasse biedt vergelijkbare functionaliteit als een normale dictionary, maar er zijn enkele belangrijke verschillen:

1. Meerdere waarden onder dezelfde sleutel opslaan mogelijk

Een normale dictionary kan slechts één waarde per sleutel opslaan, terwijl QueryDict meerdere waarden onder dezelfde sleutel kan opslaan.

Bijvoorbeeld, wanneer je een query string hebt zoals ?key=value1&key=value2:

request.GET.get('key')       # 'value1' (eerste waarde)
request.GET.getlist('key')   # ['value1', 'value2'] (alle waarden)

2. Onveranderlijkheid (Immutable)

Standaard is QueryDict onveranderlijk. Om waarden te bewerken of toe te voegen, moet je eerst een kopie maken:

mutable_querydict = request.GET.copy()
mutable_querydict['new_key'] = 'new_value'

3. Functionaliteit die verder gaat dan een dictionary

Methoden zoals getlist() zijn niet beschikbaar in een normale dictionary, maar zijn een van de krachtige functies die QueryDict biedt.

Django QueryDict concept image

Waarom is het zo ontworpen?

De reden voor deze opzet is eenvoudig. In webapplicaties is het vaak nodig om meerdere gegevens met dezelfde naam te behandelen, en door onveranderlijkheid te handhaven, kan de integriteit van de gegevens worden gewaarborgd. QueryDict voldoet aan deze eisen en biedt tegelijkertijd een API in de stijl van een dictionary die voor ontwikkelaars vertrouwd is. Gebruikers kunnen complexe HTTP-vraaggegevens eenvoudig verwerken, alsof ze met een dictionary werken.


De vreugde van het ontdekken van de principes van Django

Het was een vraag ontstaan uit kleine nieuwsgierigheid, maar het zoeken naar het antwoord maakte me onder de indruk van het zorgvuldige en efficiënte ontwerp van Django.

Het ontdekken van het bestaan van QueryDict en zijn speciale functies heeft me opnieuw doen beseffen hoe ontwikkelaar-vriendelijk Django als framework is.

Ik moedig jullie aan om ook de kleine nieuwsgierigheid te verkennen die soms naar boven komt tijdens het gebruik van Django. Er wacht ongetwijfeld nieuwe vreugde en inspiratie op jullie. 😊

Geniet van het programmeren terwijl je de werking van Django onderzoekt! 🎉