Метод as_view
Метод as_view применяется к классам представлений (наследникам View) и возвращает вызываемую функцию, которая принимает объект запроса и возвращает объект ответа. Этот метод является ключевым звеном между URL-диспетчером и классами представлений, позволяя использовать объектно-ориентированный подход при обработке HTTP-запросов. Метод принимает именованные аргументы, которые передаются в качестве атрибутов экземпляра класса при его создании.
Синтаксис
ViewClass.as_view(**initkwargs)
Пример . С базовым классом View
Давайте создадим простое представление, которое обрабатывает GET-запросы и возвращает приветствие:
from django.http import HttpResponse
from django.views import View
class GreetingView(View):
def get(self, request, name):
return HttpResponse(f"Hello, {name}!")
# В urls.py
from django.urls import path
from .views import GreetingView
urlpatterns = [
path('greet/<str:name>/', GreetingView.as_view(), name='greet'),
]
Результат обращения к URL '/greet/John/':
"Hello, John!"
Пример . С передачей аргументов в as_view
Метод as_view позволяет передавать начальные параметры для настройки поведения представления:
from django.http import HttpResponse
from django.views import View
class ConfigurableView(View):
template_name = 'default.html'
def get(self, request):
return HttpResponse(f"Using template: {self.template_name}")
# В urls.py - передаем параметр template_name
urlpatterns = [
path('page1/', ConfigurableView.as_view(template_name='page1.html')),
path('page2/', ConfigurableView.as_view(template_name='page2.html')),
]
Результат обращения к URL '/page1/':
"Using template: page1.html"
Пример . С обработкой нескольких HTTP-методов
Класс представления может определять методы для различных HTTP-методов, а as_view автоматически вызывает нужный метод в зависимости от типа запроса:
from django.http import HttpResponse, JsonResponse
from django.views import View
class ArticleView(View):
articles = [
{'id': 1, 'title': 'First article'},
{'id': 2, 'title': 'Second article'},
]
def get(self, request, article_id=None):
if article_id is None:
return JsonResponse(self.articles, safe=False)
article = next((a for a in self.articles if a['id'] == article_id), None)
if article:
return JsonResponse(article)
return HttpResponse('Article not found', status=404)
def post(self, request):
return HttpResponse('Article created', status=201)
def delete(self, request, article_id):
return HttpResponse(f'Article {article_id} deleted', status=204)
# В urls.py
urlpatterns = [
path('articles/', ArticleView.as_view()),
path('articles/<int:article_id>/', ArticleView.as_view()),
]
Результат GET-запроса к '/articles/1/':
{"id": 1, "title": "First article"}
Пример . С обработкой ошибок
Метод as_view поддерживает использование декораторов и обработку исключений через метод dispatch:
from django.http import HttpResponse, HttpResponseBadRequest
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
class SecureView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
try:
return super().dispatch(request, *args, **kwargs)
except ValueError as e:
return HttpResponseBadRequest(f"Invalid data: {e}")
def post(self, request):
data = request.POST.get('data')
if not data:
raise ValueError("Data is required")
return HttpResponse(f"Received: {data}")
urlpatterns = [
path('secure/', SecureView.as_view()),
]