Django Views & URL Routing
Views in Django are Python functions or classes that receive web requests and return web responses. URL routing maps URLs to appropriate views.
What are Django Views?
Views are the core of Django applications:
- Receive an HTTP request
- Process the request (possibly using models)
- Return an HTTP response
- Can be function-based or class-based
Function-Based Views
The simplest type of view is a function that takes a request and returns a response:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, World!")
URL Configuration
To connect a view to a URL, you need a URLconf (URL configuration) module:
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world),
]
Basic View Examples
Here are some common view patterns:
Simple Response
from django.http import HttpResponse
def current_time(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
Dynamic URL Parameters
def greet(request, name):
return HttpResponse(f"Hello, {name}!")
URL pattern:
path('greet/<str:name>/', views.greet),
Query Parameters
def search(request):
query = request.GET.get('q', '')
return HttpResponse(f"You searched for: {query}")
Accessed via /search/?q=django
Common Response Types
Django provides several response classes:
HttpResponse
- Basic response with any contentHttpResponseRedirect
- Redirect to another URLJsonResponse
- JSON-encoded responseFileResponse
- Stream a fileStreamingHttpResponse
- Stream a response
Template Responses
Django makes it easy to return HTML responses using templates:
from django.shortcuts import render
def book_list(request):
books = Book.objects.all()
return render(request, 'books/list.html', {'books': books})
Class-Based Views
Django provides class-based views for common patterns:
from django.views import View
class GreetView(View):
def get(self, request, name):
return HttpResponse(f"Hello, {name}!")
URL pattern:
path('greet/<str:name>/', views.GreetView.as_view()),
Common Built-in Class-Based Views
Django provides many generic class-based views:
TemplateView
- Render a templateListView
- Display a list of objectsDetailView
- Display a single objectCreateView
- Create a new objectUpdateView
- Update an objectDeleteView
- Delete an objectFormView
- Display and process a form
ListView Example
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'books/list.html'
context_object_name = 'books'
DetailView Example
from django.views.generic import DetailView
from .models import Book
class BookDetailView(DetailView):
model = Book
template_name = 'books/detail.html'
URL Patterns
Django's URL dispatcher uses these components:
path()
- For simple pathsre_path()
- For complex regex patternsinclude()
- To include other URLconfs
Path Converters
Django provides several path converters:
str
- Matches any non-empty string (default)int
- Matches zero or any positive integerslug
- Matches any slug string (ASCII letters, numbers, hyphens, underscores)uuid
- Matches a formatted UUIDpath
- Matches any non-empty string including path separators
URL Namespaces
Namespaces help avoid URL name collisions:
# Main urls.py
path('books/', include('books.urls', namespace='books')),
# books/urls.py
app_name = 'books'
urlpatterns = [
path('', views.BookListView.as_view(), name='list'),
]
Then in templates:
<a href="{% url 'books:list' %}">Book List</a>
Reverse URL Resolution
Generate URLs from view names:
from django.urls import reverse
def my_view(request):
url = reverse('books:detail', args=[1])
# or
url = reverse('books:detail', kwargs={'pk': 1})
View Decorators
Decorators add functionality to views:
@login_required
- Restrict to logged-in users@permission_required
- Check permissions@require_http_methods
- Restrict HTTP methods@cache_control
- Set caching headers
Login Required Example
from django.contrib.auth.decorators import login_required
@login_required
def my_profile(request):
return render(request, 'profile.html')
Request and Response Objects
Key attributes of request objects:
request.method
- HTTP method (GET, POST, etc.)request.GET
- GET parametersrequest.POST
- POST parametersrequest.FILES
- Uploaded filesrequest.user
- Current userrequest.session
- Session data
Middleware
Middleware are hooks for processing requests/responses globally:
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Code executed on each request before the view
response = self.get_response(request)
# Code executed on each response after the view
return response
Built-in Middleware
Common middleware classes:
CommonMiddleware
- Adds useful headersSessionMiddleware
- Session supportAuthenticationMiddleware
- Associates users with requestsMessageMiddleware
- Cookie-based messagesCsrfViewMiddleware
- CSRF protection
View Best Practices
- Keep views focused and simple
- Move business logic to models or services
- Use class-based views for common patterns
- Use namespaces for URL names
- Handle different HTTP methods properly
- Use appropriate status codes