Подтвердить что ты не робот

Django rest framework api_view vs normal view

Я искал повсюду, чтобы найти достойное объяснение для этого, и все они короты... Когда вы используете декоратор @api_view, а не классный взгляд с приложение django rest framework

4b9b3361

Ответ 1

REST Framework в стороне, это тот же вопрос, когда использовать общие взгляды на основе класса и функции в целом. CBVs в Django являются удивительными, гибкими и сохраняют множество шаблонов кода, но иногда это просто быстрее, проще и понятнее использовать функцию, основанную на представлении. Подумайте об этом с тем же подходом, что и вы, чтобы написать нормальный вид в Django. REST Framework просто поддерживает оба метода написания кода представления, поскольку он вводит в tutorial.

В общем, пойдите с CBV, если это не будет на вашем пути, а затем сохраните его с помощью функции, основанной на представлении, и декоратора. В Django и REST Framework логика типичных вещей, таких как списки, разбиение на страницы и CRUD-операции, уже написана и легко расширяется в виде классов и mixins. Если ваша логика представления делает что-то заметно другое, может быть целесообразным представление, основанное на функциях. И, конечно же, вы можете использовать оба подхода в своем приложении.

Ответ 2

Лично я использую базовый класс APIView или декоратор @api_view только тогда, когда мне нужно сделать что-то очень специфичное/обычай. Например, чтобы показать список URL-адресов конечной точки, агрегировать данные из разных моделей определенным образом и т.д.

Всякий раз, когда я общаюсь с обычным списком, создаю, обновляю и удаляю операции, я использую другие классы (Retrieve, Create, Update and Destroy Views или Mixins).

Пример использования @api_view декоратора, чтобы составить список всех конечных точек моего приложения:

from django.core.urlresolvers import NoReverseMatch

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse

from .urls import urlpatterns


@api_view(('GET',))
def root_endpoint(request, format=None):
    """
    List of all the available resources of this RESTful API.
    """
    endpoints = []

    # loop over url modules
    for urlmodule in urlpatterns:

        # is it a urlconf module?
        try:
            urlmodule.urlconf_module
            is_urlconf_module = True
        except AttributeError:
            is_urlconf_module = False

        # if url is really a urlmodule
        if is_urlconf_module:

            # loop over urls of that module
            for url in urlmodule.urlconf_module.urlpatterns:

                # TODO: configurable skip url in settings
                # skip api-docs url
                if url.name in ['django.swagger.resources.view']:
                    continue

                # try adding url to list of urls to show
                try:
                    endpoints.append({
                        'name': url.name.replace('api_', ''),
                        'url': reverse(url.name, request=request, format=format)
                    })
                # urls of object details will fail silently (eg: /nodes/<slug>/)
                except NoReverseMatch:
                    pass


    return Response(endpoints)

Этот код находится на github.