Руководство по API платформы Django REST (3): представления

задняя часть Python Django

Руководство по API платформы Django REST (1): запросы
Руководство по API платформы Django REST (2): ответы
Руководство по API платформы Django REST (3): представления
Руководство по API платформы Django REST (4): общие представления
Руководство по API платформы Django REST (5): наборы представлений
Руководство по API Django REST framework (6): Маршрутизация
Руководство по API платформы Django REST (7): анализ

Официальная оригинальная ссылка

представление на основе классов

Фреймворк REST обеспечиваетAPIViewкласс, который наследуется от DjangoViewсвоего рода.

APIViewкласс с разнымиViewКлассы разные:

  • Объект запроса, переданный методу обработчика, является REST framework.Requestэкземпляр, а не ДжангоHttpRequestпример.
  • Метод обработчика может возвращать REST frameworkResponse, вместо ДжангоHttpResponse. Представление будет управлять согласованием контента и задаст правильный рендерер в ответе.
  • любойAPIExceptionИсключения перехватываются и реагируют соответствующим образом.
  • Входящие запросы аутентифицируются и выполняются соответствующие проверки разрешений (разрешение или ограничение) перед отправкой запроса методу обработчика.

Как обычно, используйтеAPI​​ViewКлассы и процедуры использованияViewКлассы очень похожи, входящие запросы направляются соответствующим методам обработки, таким как.get()или.post(). Кроме того, многие свойства (AOPS) могут быть установлены в классе.

Возьмите каштан:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User

class ListUsers(APIView):
    """
    列出系统中的所有用户

    * 需要 token 认证。
    * 只有 admin 用户才能访问此视图。
    """
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

    def get(self, request, format=None):
        """
        Return a list of all users.
        """
        usernames = [user.username for user in User.objects.all()]
        return Response(usernames)

Примечание: в REST FrameworkAPIView,GenericAPIView, разныеMixinsиViewsetsСодержит множество методов и свойств, и сначала сложно во всех них разобраться. В дополнение к документации здесь естьClassy Django REST FrameworkРесурс, который предоставляет ссылку, которую можно просмотреть в Интернете, содержащую все свойства и методы.

Атрибуты политики API

Следующие свойства используются для увеличения функциональности расширенного представления АОП.

.renderer_classes
установить визуализатор

.parser_classes
установить парсер

.authentication_classes
установить аутентификатор

.throttle_classes

.permission_classes
Настроить валидатор разрешений

.content_negotiation_class

Методы реализации политики API

Следующие методы экземпляра политики обычно не требуют переопределения.

.get_renderers(self)

.get_parsers(self)

.get_authenticators(self)

.get_throttles(self)

.get_permissions(self)

.get_content_negotiator(self)

.get_exception_handler(self)

Методы реализации политики API

Следующие методы вызываются перед отправкой в ​​метод обработчика.

.check_permissions(self, request)

.check_throttles(self, request)

.perform_content_negotiation(self, request, force=False)

отправка метода

Представления используют следующие методы..dispatch()метод вызывается напрямую. Они вызывают метод обработчика (.get(), .post(), put(), patch()и.delete()) до или после его вызова.

.initial(self, request, *args, **kwargs)

Используется для выполнения любых действий, необходимых до вызова метода обработчика. Этот метод используется для обеспечения разрешений и регулирования, а также для выполнения согласования контента.

.handle_exception(self, exc)

Любое исключение, созданное методом обработчика, будет передано этому методу, который возвращаетResponseэкземпляр или повторно вызвать исключение.

Обработка по умолчаниюrest_framework.exceptions.APIExceptionЛюбой подкласс , и Django'sHttp404иPermissionDeniedисключение и вернуть соответствующий ответ об ошибке.

Этот метод следует переопределить, если вам нужно настроить ответ об ошибке, возвращаемый API.

.initialize_request(self, request, *args, **kwargs)

Убедитесь, что объект запроса, переданный методу обработчика,Requestэкземпляр Django вместо обычного DjangoHttpRequest.

Обычно нет необходимости переопределять этот метод.

.finalize_response(self, request, response, *args, **kwargs)

Убедитесь, что любой возврат от леченияResponseОбъекты будут представлены правильному типу содержимого, который определяется согласованием контента.

Обычно нет необходимости переопределять этот метод.

представление на основе методов

Платформа REST также позволяет использовать представления на основе функций. Он предоставляет простой набор декораторов для обертывания представлений функций, чтобы гарантировать, что они получаютRequest(вместо ДжангоHttpRequest) экземпляров и разрешить им возвращатьсяResponse(вместо ДжангоHttpResponse), И позволяет настроить обработку запроса.

@api_view()

подписать:@api_view(http_method_names=['GET'])

api_viewэто декоратор, который используетhttp_method_namesЧтобы установить список HTTP-методов, на которые может отвечать представление, например, напишите простое представление, которое вручную возвращает некоторые данные.

from rest_framework.decorators import api_view

@api_view()
def hello_world(request):
    return Response({"message": "Hello, world!"})

Представление будет использоватьsettingsСредство визуализации по умолчанию, парсер, класс проверки подлинности и т. д., указанные в .

По умолчанию толькоGETМетод будет принят. Другие методы будут"405 Method Not Allowed"Отвечать. Чтобы изменить это поведение, укажите метод, разрешенный представлением, как показано ниже:

@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method == 'POST':
        return Response({"message": "Got some data!", "data": request.data})
    return Response({"message": "Hello, world!"})

Декораторы политик API

Чтобы переопределить настройки по умолчанию, платформа REST предоставляет ряд дополнительных декораторов, которые можно добавить в представления. Они должны быть в@api_viewПосле декоратора (ниже). Например, чтобы создать с помощьюthrottleЧтобы убедиться, что конкретный пользователь может вызывать его только один раз в день, используйте@throttle_classesдекоратор, проходящийthrottleСписок классов:

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle

class OncePerDayUserThrottle(UserRateThrottle):
        rate = '1/day'

@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view(request):
    return Response({"message": "Hello for today! See you tomorrow!"})

Эти декораторы соответствуютAPIViewАтрибут политики установлен на .

Доступные декораторы:

  • @renderer_classes(...)
  • @parser_classes(...)
  • @authentication_classes(...)
  • @throttle_classes(...)
  • @permission_classes(...)

У каждого декоратора есть аргумент, который должен быть списком классов или кортежем классов.

Просмотр декоратора схемы

Чтобы переопределить генерацию схемы по умолчанию для представлений функций, вы можете использовать@schemaДекоратор. Это должно быть@api_viewПосле декоратора (ниже). Например:

from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema

class CustomAutoSchema(AutoSchema):
    def get_link(self, path, method, base_url):
        # override view introspection here...

@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
    return Response({"message": "Hello for today! See you tomorrow!"})

Этот декоратор займетAutoSchemaэкземпляр, аAutoSchemaэкземпляр подкласса илиManualSchemaпример, такой какДокументация по схемам(сначала выпустите официальную цепочку). Вы также можете пройтиNoneчтобы исключить представления из генерации схемы.

@api_view(['GET'])
@schema(None)
def view(request):
    return Response({"message": "Will not appear in schema!"})