Introduction
The request.user attribute is your gateway to the current user. Understanding how it works is essential for building authenticated features.
Key Concepts
request.user: The current user (User or AnonymousUser).
is_authenticated: Boolean property for auth status.
Real World Context
In a SaaS dashboard, almost every view needs to know who is making the request. You use request.user to filter data to the current tenant, display personalized content, and log audit trails. Getting this wrong means users see each other's data -- a critical security flaw.
Deep Dive
Checking Authentication
pythondef my_view(request): if request.user.is_authenticated: # User is logged in username = request.user.username email = request.user.email else: # AnonymousUser pass
AnonymousUser Properties
pythonfrom django.contrib.auth.models import AnonymousUser anon = AnonymousUser() anon.is_authenticated # False anon.is_anonymous # True anon.id # None anon.pk # None anon.username # '' (empty string) anon.has_perm('any') # False
Common Patterns
python# Get user or None for optional relations author = request.user if request.user.is_authenticated else None # Filter by user articles = Article.objects.filter( author=request.user ) if request.user.is_authenticated else Article.objects.none()
Common Pitfalls
- Accessing user attributes without checking
is_authenticated:request.user.emailon anAnonymousUserreturns an empty string, which can silently corrupt queries likefilter(email=request.user.email)by returning unrelated rows. - Comparing
request.usertoNone:request.useris neverNone-- it is either aUseror anAnonymousUser. Useis_authenticatedinstead. - Caching
request.useracross requests: The user object is request-scoped. Storing it in a module-level variable leads to thread-safety bugs.
Best Practices
- Always check is_authenticated: Before accessing user properties.
- Don't compare to None: Use is_authenticated instead.
- Handle AnonymousUser gracefully: Don't assume logged in.
Summary
request.user is always available - it's either a User or AnonymousUser. Always check is_authenticated before accessing user-specific data.