Метод as_view

Метод as_view применяется к классам представлений (наследникам View) и возвращает вызываемую функцию, которая принимает объект запроса и возвращает объект ответа. Этот метод является ключевым звеном между URL-диспетчером и классами представлений, позволяя использовать объектно-ориентированный подход при обработке HTTP-запросов. Метод принимает именованные аргументы, которые передаются в качестве атрибутов экземпляра класса при его создании.

Синтаксис

pythonViewClass.as_view(**initkwargs)

Пример . С базовым классом View

Давайте создадим простое представление, которое обрабатывает GET-запросы и возвращает приветствие:

pythonfrom 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/':

python"Hello, John!"

Пример . С передачей аргументов в as_view

Метод as_view позволяет передавать начальные параметры для настройки поведения представления:

pythonfrom 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/':

python"Using template: page1.html"

Пример . С обработкой нескольких HTTP-методов

Класс представления может определять методы для различных HTTP-методов, а as_view автоматически вызывает нужный метод в зависимости от типа запроса:

pythonfrom 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/':

python{"id": 1, "title": "First article"}

Пример . С обработкой ошибок

Метод as_view поддерживает использование декораторов и обработку исключений через метод dispatch:

pythonfrom 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()),
]

Смотрите также

  • класс View,
    базовый класс для всех классовых представлений
  • метод dispatch,
    который определяет, какой HTTP-метод будет вызван
  • метод get,
    обрабатывающий GET-запросы в классе представления
  • метод post,
    обрабатывающий POST-запросы в классе представления