Bird
Raised Fist0
Djangoframework~10 mins

Per-view caching in Django - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Per-view caching
User sends HTTP request
Django receives request
Check cache for view response
Return cached
Send response
Send response
The flow shows how Django checks if a cached response exists for a view before running it, returning cached data if found, or running and caching the view output if not.
Execution Sample
Django
@cache_page(60)
def my_view(request):
    return HttpResponse('Hello World')
This code caches the response of my_view for 60 seconds, so repeated requests within that time get the cached response.
Execution Table
StepActionCache Check ResultView ExecutionResponse Sent
1User sends request to my_viewCache miss (no cached response)my_view runs, returns 'Hello World'Response 'Hello World' sent and cached
2User sends request again within 60 secondsCache hit (cached response found)View not executedCached response 'Hello World' sent
3User sends request after 60 secondsCache expired (no cached response)my_view runs again, returns 'Hello World'Response 'Hello World' sent and cached again
💡 Execution stops after sending response; cache is checked each request to decide if view runs or cached response is used.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3
cacheemptycontains 'my_view' responsecontains 'my_view' responsecontains refreshed 'my_view' response
view_executedFalseTrueFalseTrue
response_sentNone'Hello World''Hello World' (cached)'Hello World'
Key Moments - 2 Insights
Why doesn't the view function run on the second request?
Because the cache contains a valid response from the first request (see execution_table step 2), Django returns the cached response directly without running the view.
What happens when the cache expires after 60 seconds?
The cache no longer has a valid response (execution_table step 3), so Django runs the view again and caches the new response.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the cache status at step 2?
ACache hit with cached response
BCache miss, view runs
CCache expired, view runs
DCache empty
💡 Hint
Check the 'Cache Check Result' column at step 2 in the execution_table
At which step does the view function execute again after cache expiration?
AStep 1
BStep 2
CStep 3
DNever
💡 Hint
Look at the 'View Execution' column in execution_table for when the view runs
If the cache timeout was changed to 120 seconds, how would step 3 change?
AStep 3 would be a cache miss, view executed
BStep 3 would be a cache hit, view not executed
CStep 3 would not happen
DStep 3 would send no response
💡 Hint
Longer cache timeout means cached response still valid at step 3 (see variable_tracker cache variable)
Concept Snapshot
Per-view caching in Django uses @cache_page(seconds) decorator.
It stores the full HTTP response for the view.
On requests, Django checks cache first.
If cached, returns it immediately.
If not, runs view, caches response, then returns it.
Cache timeout controls how long response is stored.
Full Transcript
Per-view caching in Django works by storing the full response of a view for a set time. When a user sends a request, Django first checks if a cached response exists. If yes, it returns that cached response without running the view function again. If no cached response exists or the cache expired, Django runs the view, caches the new response, and sends it back. This speeds up repeated requests by avoiding repeated view processing. The cache timeout defines how long the response stays cached before Django runs the view again.

Practice

(1/5)
1. What is the main purpose of using @cache_page(timeout) in Django views?
easy
A. To connect the view to the database
B. To save the view's output and speed up repeated visits
C. To validate user input before processing
D. To handle user authentication automatically

Solution

  1. Step 1: Understand what caching does

    Caching stores the output of a view so it can be reused without recalculating.
  2. Step 2: Recognize the role of @cache_page(timeout)

    This decorator saves the rendered page for the given timeout to speed up future requests.
  3. Final Answer:

    To save the view's output and speed up repeated visits -> Option B
  4. Quick Check:

    Per-view caching = save output for speed [OK]
Hint: Caching saves page output to speed up repeated visits [OK]
Common Mistakes:
  • Thinking it validates input
  • Confusing caching with authentication
  • Assuming it connects to the database
2. Which of the following is the correct way to apply per-view caching with a 5-minute timeout in Django?
easy
A. @cache_page('300') def my_view(request): pass
B. @cache_page(5) def my_view(request): pass
C. @cache_page(timeout=5) def my_view(request): pass
D. @cache_page(300) def my_view(request): pass

Solution

  1. Step 1: Understand the timeout parameter

    The timeout is in seconds, so 5 minutes = 300 seconds.
  2. Step 2: Check correct syntax for @cache_page

    The decorator takes an integer timeout in seconds without quotes.
  3. Final Answer:

    @cache_page(300)\ndef my_view(request):\n pass -> Option D
  4. Quick Check:

    Timeout in seconds, no quotes = @cache_page(300) def my_view(request): pass [OK]
Hint: Timeout is seconds as integer, no quotes [OK]
Common Mistakes:
  • Using string '300' instead of integer
  • Passing timeout as minutes instead of seconds
  • Using keyword argument timeout incorrectly
3. Given this Django view with per-view caching:
@cache_page(60)
def home(request):
    return HttpResponse(str(time.time()))

What will happen if you refresh the page multiple times within 60 seconds?
medium
A. The page shows the same timestamp for 60 seconds
B. The page shows a new timestamp on every refresh
C. The page raises an error because time.time() is not cached
D. The page shows timestamps increasing by 60 seconds

Solution

  1. Step 1: Understand what @cache_page(60) does

    It caches the entire response for 60 seconds.
  2. Step 2: Analyze the effect on time.time()

    Since the response is cached, the timestamp won't update until cache expires.
  3. Final Answer:

    The page shows the same timestamp for 60 seconds -> Option A
  4. Quick Check:

    Cache holds output unchanged for timeout [OK]
Hint: Cached view returns same output until timeout expires [OK]
Common Mistakes:
  • Expecting timestamp to update every refresh
  • Thinking caching only affects database queries
  • Assuming cache raises errors with dynamic content
4. You wrote this Django view with caching:
from django.views.decorators.cache import cache_page

@cache_page('60')
def about(request):
    return HttpResponse('About page')

Why does this code cause an error?
medium
A. The timeout value is a string instead of an integer
B. The decorator is missing parentheses
C. The view function must be a class-based view
D. The import statement is incorrect

Solution

  1. Step 1: Check the timeout argument type

    The timeout must be an integer number of seconds, not a string.
  2. Step 2: Identify the error cause

    Passing '60' as a string causes a TypeError in the decorator.
  3. Final Answer:

    The timeout value is a string instead of an integer -> Option A
  4. Quick Check:

    Timeout must be int, not string [OK]
Hint: Timeout must be integer, not string [OK]
Common Mistakes:
  • Using quotes around timeout number
  • Forgetting parentheses on decorator
  • Thinking function type matters here
5. You want to cache a Django view that shows user-specific data but still use per-view caching. Which approach correctly applies caching without showing wrong data to users?
hard
A. Cache the view globally and add user ID in the URL to separate cache keys
B. Use @cache_page(120) without changes; caching will separate users automatically
C. Use @cache_page(120) and add Vary: Cookie header to cache per user session
D. Do not use caching on user-specific views at all

Solution

  1. Step 1: Understand caching user-specific data risks

    Global caching can show one user's data to others if not separated.
  2. Step 2: Use Vary header to separate cache by user session

    Adding Vary: Cookie tells cache to store different versions per user session cookie.
  3. Final Answer:

    Use @cache_page(120) and add Vary: Cookie header to cache per user session -> Option C
  4. Quick Check:

    Vary header separates cache by user [OK]
Hint: Use Vary header to separate cache per user [OK]
Common Mistakes:
  • Assuming caching separates users automatically
  • Avoiding caching user views unnecessarily
  • Adding user ID in URL without proper cache keys