Три сертифицированных компонентов

Три сертифицированных компонентов

Аутентификация

Вы можете настроить схему проверки подлинности по умолчанию в глобальном файле конфигурации

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',   # 基本认证
    )
}

Свойство может быть также authentication_classess расположены в каждом представлении

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    # 类属性
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    ...

Ошибка аутентификации существует два возможных возвращаемых значений:

  • 401 Несанкционированное неаутентифицированное
  • 403 Отказано разрешения запрещено

права доступа права доступа

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

  • В передней зрения осуществления способа доставки (), сначала будет оцениваться доступ на просмотр
  • При получении конкретных объектов от get_object (), она будет осуществляться для определения доступа к объектной модели

использование

Вы можете установить права доступа по умолчанию для глобального класса управления в конфигурационном файле, например,

REST_FRAMEWORK = {
    ....
    
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

Если не указано, по умолчанию конфигурации выглядит следующим образом

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)
    

Она также может быть установлена ​​с помощью специфических свойств permission_classes зрения, как

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ...
    pass

права доступа при условии,

  • AllowAny позволяют всем пользователям
  • IsAuthenticated идентифицированных пользователей
  • IsAdminUser только пользователь с правами администратора
  • IsAuthenticatedOrReadOnly аутентификации пользователей Логин не может уже добавлений и удалений в эксплуатацию данных, проверка подлинности Логин может только просматривать данные.

например

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView

class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    

Пользовательские разрешения

Для пользовательских разрешений должны наследовать rest_framework.permissions.BasePermission родительский класс, и реализовать следующие два метода в любой или все

  • .has_permission(self, request, view)

    Могу ли я открыть представление, вид представляет текущий объект вида

  • .has_object_permission(self, request, view, obj)

    Вы можете получить доступ к объекту данных, вид представляет текущий вид, OBJ в качестве объектов данных

Например:

В настоящее время суб-приложений, создание пользовательского класса разрешения permissions.py декларация в файле разрешений:

from rest_framework.permissions import BasePermission

class IsXiaoMingPermission(BasePermission):
    def has_permission(self, request, view):
        if( request.user.username == "xiaoming" ):
            return True
        
from .permissions import IsXiaoMingPermission
class StudentViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    permission_classes = [IsXiaoMingPermission]
    

Ограничение Throttling

Вы можете ограничить частоту интерфейсов доступа, чтобы уменьшить давление на сервере.

Как правило, используются для оплаты сцены с помощью частотного голосования.

использование

Может быть в конфигурационном файле, использовать DEFAULT_THROTTLE_CLASSESи DEFAULT_THROTTLE_RATESнастраивается глобально,

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

DEFAULT_THROTTLE_RATESВы можете использовать second, minute, hourили dayдля обозначения цикла.

Вы можете также просмотреть , в частности , throttle_classessк свойствам конфигурации, такие как

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = (UserRateThrottle,)
    ...
    pass

Дополнительное ограничение класс

1) AnonRateThrottle

Все анонимные пользователи ограничить несанкционированное использование IP различать между пользователями.

Используйте DEFAULT_THROTTLE_RATES['anon']для установки частоты

2) UserRateThrottle

Ограничение аутентификации пользователя, используя идентификатор пользователя, чтобы отличить.

Используйте DEFAULT_THROTTLE_RATES['user']для установки частоты

3) ScopedRateThrottle

Ограничение частоты доступа пользователя для каждого вида, или внутрибрюшинно, используя идентификатор пользователя.

Например:

class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
    ...
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'contacts': '1000/day',
        'uploads': '20/day'
    }
}

примеров

Частоты доступа установлена ​​глобальная конфигурация

    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/minute',
        'user': '10/minute'
    }
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
from rest_framework.throttling import UserRateThrottle

class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    throttle_classes = (UserRateThrottle,)

Фильтр Фильтрация

Может потребоваться для фильтрации на основе полевых данных для списка, мы можем быть улучшены за счетом добавления поддержки расширения Джанго-fitlter.

pip install django-filter

Увеличение заднего конца фильтра предусмотрен в конфигурационном файле:

INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

Добавить filter_fields свойства в окне, вы можете отфильтровать заданное поле

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filter_fields = ('age', 'sex')

# 127.0.0.1:8000/four/students/?sex=1

последовательность

Для получения списка данных, структура REST обеспечивает OrderingFilter фильтры , чтобы помочь нам быстро указать данные , отсортированные по указанному полю.

Как использовать:

В классе View расположены filter_backends, используемые rest_framework.filters.OrderingFilterфильтры, рамочные REST проверяет , является ли параметры , включенные в запрос заказа параметр строки запроса, параметра упорядочения , если включены, упорядочение в соответствии с параметрами определенного сорта поле сортировки набора данных.

В качестве альтернативы заказа значения поля параметров могут пройти передний конец необходимости указать в ordering_fields.

Пример:

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'age')

# 127.0.0.1:8000/books/?ordering=-age
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序

Если вам нужно быть отсортирован снова после фильтрации, необходимо сочетание обоих!

from rest_framework.generics import ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
from django_filters.rest_framework import DjangoFilterBackend
class Student3ListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_fields = ('age', 'sex')
    # 因为局部配置会覆盖全局配置,所以需要重新把过滤组件核心类再次声明,
    # 否则过滤功能会失效
    filter_backends = [OrderingFilter,DjangoFilterBackend]
    ordering_fields = ('id', 'age')

Разбивка Разбивка

REST структура обеспечивает поддержку для пейджинга.

Мы можем установить режим глобальной подкачки в файле конфигурации, такие как:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

Класс Разбивка может также настроить , чтобы добавить другую точку зрения от поведения поискового вызова. По мнению pagination_clasуказать свойство.

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    pagination_class = LargeResultsSetPagination

Примечание: Если отключить функцию пейджинга в представлении, просто установить в окне

pagination_class = None

Дополнительный финишер

1) PageNumberPagination

Веб-сайт Front-доступа в виде:

GET  http://127.0.0.1:8000/students/?page=4

Атрибут может быть определен в подклассе:

  • PAGE_SIZE номер страницы
  • Передние страницы имена ключевых слов page_query_param послал, по умолчанию «страница»
  • Число ключевых слов на странице имени page_size_query_param послал передний конец, по умолчанию не является None
  • На странице настройки на передней max_page_size
# 声明分页的配置类
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
    # 默认每一页显示的数据量
    page_size = 2
    # 允许客户端通过get参数来控制每一页的数据量
    page_size_query_param = "size"
    max_page_size = 10
    # 自定义页码的参数名
    page_query_param = "p"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/four/students/?p=1&size=5

2) LimitOffsetPagination

Веб-сайт Front-доступа в виде:

GET http://127.0.0.1/four/students/?limit=100&offset=400

Атрибут может быть определен в подклассе:

  • default_limit ограничение по умолчанию, значение и стандартные PAGE_SIZEнастройки были
  • limit_query_param предел имя параметра, «предел» по умолчанию
  • offset_query_param смещение параметра имя, по умолчанию «смещение»
  • не max_limit максимальных предельных ограничений, Ни по умолчанию
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默认每一页查询的数据量,类似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 调用页码分页类
    # pagination_class = StandardPageNumberPagination
    # 调用查询偏移分页类
    pagination_class = StandardLimitOffsetPagination

Исключение Обработка исключений

REST структура обеспечивает обработку исключений, мы можем обработчик исключений.

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # 先调用REST framework默认的异常处理方法获得标准错误响应对象
    response = exception_handler(exc, context)

    # 在此处补充自定义的异常处理
    if response is None:
        response.data['status_code'] = response.status_code

    return response

В заявлении от файла конфигурации, определенной обработки исключений

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

Если не объявлено, он будет использовать режим по умолчанию, как показано ниже

rest_frame / settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

Например:

Обработка исключений в отношении дополнительной базы данных

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError

def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError):
            print('[%s]: %s' % (view, exc))
            response = Response({'detail': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

REST рамки, определенные исключения

  • ApiException родительский класс для всех исключений
  • Ошибка синтаксического анализа ParseError
  • AuthenticationFailed Ошибка аутентификации
  • NotAuthenticated еще не подтвержден
  • PermissionDenied права outrightly
  • NotFound не найдены
  • MethodNotAllowed метод запроса не поддерживается
  • NotAcceptable Чтобы получить формат данных не поддерживается
  • Throttled, чем ограничить число потоков
  • проверка ValidationError терпит неудачу

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

Автоматическая генерация интерфейса документации

рамки REST может помочь нам автоматически генерировать документацию интерфейса.

Документация Интерфейс представлен в виде веб-страницы.

Автоматическое формирование интерфейсной документации может быть унаследовано от APIViewвида и его подклассов.

Установка зависит

REST документация интерфейс framewrok поколения требуется coreapiдля поддержки библиотек.

pip install coreapi

Настройка интерфейса документа путь доступа

Добавление пути интерфейса документации в общем маршруте.

Конфигурация маршрутизации документов , соответствующий виду rest_framework.documentation.include_docs_urls,

Параметры titleдля документации сайта название интерфейса.

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='站点页面标题'))
]

Определение местоположения документа описывает объяснил

Документы вид строки, вид класс может быть использован в качестве 1) единого процесса, такие, как

class BookListView(generics.ListAPIView):
    """
    返回所有图书信息.
    """

2) способ, включающий в себя множество взглядов, вид класса строки документа, метод определяется отдельно, например,

class BookListCreateView(generics.ListCreateAPIView):
    """
    get:
    返回所有图书信息.

    post:
    新建图书.
    """

3) Для набора зрения Viewset, вид документа класса строк все еще закрыты, чтобы открыть определен, он должен быть использован, чтобы отличить имя действия, такие, как

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    list:
    返回图书列表数据

    retrieve:
    返回图书详情数据

    latest:
    返回最新的图书数据

    read:
    修改图书的阅读量
    """

Доступ к странице документации интерфейса

Браузер 127.0.0.1:8000/docs/ доступа, вы можете увидеть в документации интерфейса генерируется автоматически.

?? æ ¥ а £ æ ?? ???? ?? æ¡ £ ç½ é¡μ

Всего лишь две точки:

1) Просмотр Set Viewset получить имя, называется документ интерфейса сайта для чтения

2) Описание параметров должны быть определены в параметрах модели help_text класса или классов последовательностей полей, таких как:

class Student(models.Model):
    ...
    age = models.IntegerField(default=0, verbose_name='年龄', help_text='年龄')
    ...

или

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"
        extra_kwargs = {
            'age': {
                'required': True,
                'help_text': '年龄'
            }
        }

рекомендация

отwww.cnblogs.com/Dr-wei/p/11735538.html
рекомендация