Python Tutorial
Django Authentication
Use Django's built-in login, logout, and login_required to protect views that change data.
Protect a View
from django.contrib.auth.decorators import login_required
@login_required
def add_member(request):
...Unauthenticated users are redirected to LOGIN_URL (default /accounts/login/).
Built-in Auth URLs
In mysite/urls.py:
path("accounts/", include("django.contrib.auth.urls")),That gives you /accounts/login/ and /accounts/logout/. Add templates named registration/login.html.
Login Template
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Log in</button>
</form>Current User in Templates
{% if user.is_authenticated %}
Hello {{ user.username }}
{% else %}
<a href="/accounts/login/">Log in</a>
{% endif %}📘 Real-World Deep Dive
Knowing <strong>Django Auth (Django)</strong> well is what turns Django from a curiosity into a daily tool — you'll reach for it in nearly every real project.
Real-Life Scenario
An end-to-end usage of Django Auth that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
from django.contrib.auth import authenticate, login, logout
user = authenticate(request, username="a", password="b")
if user is not None:
login(request, user)
else:
return HttpResponse("invalid")
# later: logout(request)Expected Output
(no output)Common mistakes
- Forgetting to call
.save()on a model instance after mutation silently persists nothing. - Reading every row with
Model.objects.all()on a 1 M-row table OOMs the worker — use.iterator()for streaming. - Queries inside loops produce N+1 problems — pull related rows with
select_related/prefetch_related. - Treating Django Auth as a black box without reading the docs — the API has subtle defaults that bite when you scale.
🚀 Performance & Best Practices
- Add database indexes (
db_index=TrueorMeta.indexes) on columns used infilter. - Use
cache_pageon read-heavy views and setCONN_MAX_AGEto keep DB connections warm. - Generate migrations with
python manage.py makemigrations --dry-run --verbosity 3and review before committing. - When working with Django, prefer vectorised / batched operations over Python loops.
🧪 Try It Yourself
- Reproduce the snippet on a representative slice of your own data.
- Profile the snippet with
cProfileortimeitand find the single biggest improvement. - Generalise the snippet into a small, reusable function you can drop into future projects.