Три сертифицированных компонентов
Аутентификация
Вы можете настроить схему проверки подлинности по умолчанию в глобальном файле конфигурации
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': '年龄'
}
}