3. Расширенный вид DRF и общие функции DRF
3. Расширенный вид DRF и общие функции DRF

Представления DRF и общие функции

Просмотр DRF

Посмотреть введение в класс DRF

Платформа DRF предоставляет множество общих базовых классов представлений и классов расширения для упрощения написания представлений.

  • Представление: базовый класс представления Django по умолчанию, который отвечает за подключение представления к URL-адресу и базовое планирование метода HTTP-запроса. Обычно он используется при написании представлений классов раньше.
  • APIView: базовый класс всех представлений, предоставляемых DRF, наследует и расширяет View и имеет такие функции, как аутентификация личности, проверка разрешений и управление потоком.。
  • GenericAPIView: инкапсуляция APIView более высокого уровня, например добавление пагинации и устройств фильтрации.
  • GenericViewSet: наследует GenericAPIView и ViewSet.
  • ViewSet: наследует APIView и объединяет его с маршрутизатором для автоматического сопоставления маршрутов.
  • ModelViewSet: наследует GenericAPIView и пять классов расширения, инкапсулирует различные запросы, является более полным и практически не требует самостоятельного написания бизнес-логики.

Класс APIView

APIView: базовый класс всех представлений, предоставляемых DRF, наследует и расширяет View и имеет такие функции, как аутентификация личности, проверка разрешений и управление потоком.

  1. Создать проект
  1. Создайте приложение и добавьте settings.py
Язык кода:javascript
копировать
E:\workspace\django-project\day2\django_drf>python manage.py startapp myapp
  1. Основная конфигурация маршрутизации проекта: django_drf/urls.py
  1. Создать вид проекта: myapp/views.py
Язык кода:javascript
копировать
from rest_framework.views import APIView
from rest_framework.response import Response

class UserAPIView(APIView):
    def get(self,request):
        data = {'result': 'get'}
        return Response(data)
    def post(self,request):
        data = {'result': 'post'}
        return Response(data)
    def put(self,request):
        data = {'result': 'put'}
        return Response(data)
    def delete(self,request):
        data = {'result': 'delete'}
        return Response(data)
  1. Конфигурация маршрутизации проекта: myapp/urls.py
Язык кода:javascript
копировать
from django.urls import re_path
from myapp import views

urlpatterns = [
    re_path('^users1/$', views.UserAPIView.as_view())
]
  1. Начало тестирования проекта
  1. Проверка доступа через браузер: http://127.0.0.1:8000/myapp/users1/

Запрос и ответ

Request

Объект запроса, передаваемый в представление DRF, больше не является объектом Django HttpRequest по умолчанию, а является объектом класса Request, основанным на расширении класса HttpRequest.

Данные объекта Request автоматически анализируются в едином формате данных на основе данных, отправленных внешним интерфейсом.

  • Общие свойства:
    • request.data: возвращает данные, отправленные POST, аналогично request.POST.
    • request.query_params: запрос GET Параметры URL, аналогичные request.GET
  1. Браузер получает тест: http://127.0.0.1:8000/myapp/users1/?a=123&b=456
  2. Просмотр данных get_params
  1. проверка данных публикации
  1. Просмотр данных request.data
Получение и публикация сценариев и функций отправки данных
  • get
    • Получить данные
    • Отправленные данные имеют ограничение по длине
    • Передача осуществляется в виде открытого текста
  • post
    • Отправить данные
    • Отправить данные无长度限制
    • 请求bodyсередина Отправить данные, более высокий коэффициент безопасности
Response

DRF предоставляет класс ответа Response, и данные ответа будут автоматически преобразованы в формат данных JSON, соответствующий интерфейсу.

Импорт:

from rest_framework.response import Response

Формат:

Response(data, status=None, template_name=None, headers=None, content_type=None)

  • данные: ответьте на сериализованные данные и передайте объект Python
  • статус: код состояния, по умолчанию 200
  • template_name: Имя шаблона
  • заголовки: словарь заголовков ответов.
  • content_type: Тип данных ответа

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

return Reponse(data=data, status=status.HTTP_404_NOT_FOUND)

Чтобы облегчить настройку кодов состояния, модуль rest_framework.status предоставляет все коды состояния HTTP. Ниже приведены некоторые часто используемые коды:

Язык кода:javascript
копировать
HTTP_200_OK: запрос успешен
HTTP_301_MOVED_PERMANENTLY: постоянное перенаправление
HTTP_302_FOUND: временное перенаправление
HTTP_304_NOT_MODIFIED: запрошенный ресурс не был изменен.
HTTP_403_FORBIDDEN: нет разрешения на доступ
HTTP_404_NOT_FOUND: страница не найдена
HTTP_500_INTERNAL_SERVER_ERROR: внутренняя ошибка сервера
HTTP_502_BAD_GATEWAY: неверный шлюз
HTTP_503_SERVICE_UNAVAILABLE: сервер недоступен.
HTTP_504_GATEWAY_TIMEOUT: тайм-аут шлюза

GenericAPIView

  • GenericAPIView инкапсулирует APIView на более высоком уровне и реализует следующие функции:
    • Добавьте атрибут queryset, чтобы указать данные для операции. Нет необходимости передавать данные в сериализатор, они будут реализованы автоматически.
    • Добавьте атрибут сериализатор_класс, чтобы напрямую указать используемый сериализатор.
    • Добавлен атрибут фильтра: filter_backends.
    • Добавлен атрибут Пагинация: pagination_class.
    • Добавьте атрибут Lookup_field и реализуйте метод get_object(): используется для получения одного фрагмента данных, а имя группы по умолчанию (pk) можно настроить.
  1. Добавьте модель приложения на основе вышеуказанного проекта: myapp/models.py.
Язык кода:javascript
копировать
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=64)
    sex = models.CharField(max_length=8)
    age = models.IntegerField()
  1. Добавлена ​​сериализация приложений: myapp/serializers.py.
Язык кода:javascript
копировать
from myapp.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
  1. Добавить тестовые данные
Язык кода:javascript
копировать
E:\workspace\django-project\day2\django_drf>python manage.py makemigrations
E:\workspace\django-project\day2\django_drf>python manage.py migrate
E:\workspace\django-project\day2\django_drf>python manage.py shell
In [1]: from myapp.models import User
In [2]: User.objects.create(name="Чжан Сан",city="Пекин",sex="Мужской",возраст=29)
In [3]: User.objects.create(name="Ли Си",city="Шанхай",sex="женский",возраст=19)
In [4]: User.objects.create(name="Ашан",city="Город Гуанчжоу",sex="Женский",возраст=23)
In [5]: User.objects.create(name="Ах Яо",city="Город Шэньчжэнь",секс="мужской",age=21)
  1. Создайте класс представления приложения: myapp/views.py.
Язык кода:javascript
копировать
from myapp.models import User
from rest_framework.generics import GenericAPIView
from .serializers import UserSerializer
from rest_framework.response import Response

class UserGenericAPIViews(GenericAPIView):
    queryset = User.objects.all()  #Указываем данные для операции
    serializer_class = UserSerializer   #Указать сериализатор
    lookup_field = 'id'
    def get(self,request, id=None):
        if id:
            user_obj = self.get_object()   #Вызов указанных данных из метода класса, идентификатор передавать не нужно
            user_ser = self.get_serializer(user_obj)
        else:
            quertset = self.get_queryset()  # Вызов всех данных из метода класса
            user_ser = self.get_serializer(quertset, many=True) #Вызов сериализатора из метода класса
        result = {"code": 200, "msg": "success", "data": user_ser.data}
        return Response(result)

    def post(self,request):
        user_ser = self.get_serializer(data=request.data)
        user_ser.is_valid(raise_exception=True)
        user_ser.save()
        result = {"code": 200, "msg": "create success"}
        return Response(result)

    def put(self,request,id=None):
        user_obj = self.get_object()
        user_ser = self.get_serializer(instance=user_obj,data=request.data)
        user_ser.is_valid(raise_exception=True)
        result = {"code": 200, "msg": "update success"}
        return Response(result)
    
    def delete(self,request,id=None):
        user_obj = self.get_object()
        user_obj.delete()
        result = {"code": 200, "msg": "delete success"}
        return Response(result)
  1. Создайте маршрут приложения: myapp/urls.py.
Язык кода:javascript
копировать
from django.urls import re_path
from myapp import views

urlpatterns = [
    re_path('^users1/$', views.UserAPIView.as_view()),
    re_path('^users2/$',views.UserGenericAPIViews.as_view()),  #Получаем все данные и создаем
    re_path('^users2/(?P<id>\d+)/$',views.UserGenericAPIViews.as_view()),  #Получаем один фрагмент данных и его обновления и удаляем его
]
  1. Функциональное тестирование
Язык кода:javascript
копировать
http://127.0.0.1:8000/myapp/users2/    #list,почта
http://127.0.0.1:8000/myapp/users2/5/ #Обновляем указанные данные идентификатора,удалить,Проверять

Класс ViewSet

GenericAPIView выполнил множество функций.,Но будет проблема,Для получения списка всех пользователей и одного пользователя необходимо определить два представления и URL-маршруты соответственно.,Эту проблему можно очень хорошо решить с помощью ViewSet.,и понялАвтоматическое отображение маршрута

ViewSet больше не реализует методы get(), post() и другие, но реализует следующие действия метода запроса:

Язык кода:javascript
копировать
 list(): Получить все данные
 извлечь(): получить отдельные данные
 create(): Создать данные
 update(): обновить данные
 destory():удалитьданные
  1. Измените класс представления приложения: myapp/views.py.
Язык кода:javascript
копировать
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from myapp.models import User
from .serializers import UserSerializer

class UserViewSet(ViewSet):
	lookup_field = 'id'    #Это нужно использовать при автоматической регистрации маршрутов
    def list(self,request):
        user_obj = User.objects.all()
        user_ser = UserSerializer(user_obj, many=True)
        result = {"code": 200, "msg": "success", "data": user_ser.data}
        return Response(result)

    def retrieve(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_ser = UserSerializer(user_obj)
        result = {"code": 200, "msg": "success", "data": user_ser.data}
        return Response(result)

    def update(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_ser = UserSerializer(instance=user_obj,data=request.data)
        user_ser.is_valid(raise_exception=True)
        user_ser.save()
        result = {"code": 200, "msg": "update success"}
        return Response(result)

    def create(self,request):
        user_ser = UserSerializer(data=request.data)
        user_ser.is_valid(raise_exception=True)
        user_ser.save()
        result = {"code": 200, "msg": "create success"}
        return Response(result)

    def destory(self,request,id=None):
        user_obj = User.objects.get(id=id)
        user_obj.delete()
        result = {"code": 200, "msg": "delete success"}
        return Response(result)
  1. Измените маршрутизацию приложения: myapp/urls.py.
Язык кода:javascript
копировать
from django.urls import re_path
from myapp import views

urlpatterns = [
    re_path('^users1/$', views.UserAPIView.as_view()),
    re_path('^users2/$',views.UserGenericAPIViews.as_view()),  #Получаем все данные и создаем
    re_path('^users2/(?P<id>\d+)/$',views.UserGenericAPIViews.as_view()),  #Получаем один фрагмент данных и его обновления и удаляем его
    re_path('^users3/$',views.UserViewSet.as_view({'get': 'list','post': 'create'})),  #Получаем все данные и создаем
    re_path('^users3/(?P<id>\d+)/$',views.UserViewSet.as_view({'get': 'retrieve','put': 'update','delete': 'destory'})),  #Получаем один фрагмент данных и его обновления и удаляем его
]
  1. Функциональное тестирование
Язык кода:javascript
копировать
http://127.0.0.1:8000/myapp/users3/    #list,почта
http://127.0.0.1:8000/myapp/users3/5/ #Обновляем указанные данные идентификатора,удалить,Проверять
Автоматическая регистрация маршрута
  1. Измените маршрутизацию приложения: myapp/urls.py.
Язык кода:javascript
копировать
from django.urls import re_path,include
from myapp import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('user4',views.UserViewSet,'user4')
router.register('user5',views.UserViewSet,'user5')  #Зарегистрируйтесь еще раз

urlpatterns = [
    re_path('^users1/$', views.UserAPIView.as_view()),
    re_path('^users2/$',views.UserGenericAPIViews.as_view()),  #Получаем все данные и создаем
    re_path('^users2/(?P<id>\d+)/$',views.UserGenericAPIViews.as_view()),  #Получаем один фрагмент данных и его обновления и удаляем его
    re_path('^users3/$',views.UserViewSet.as_view({'get': 'list','post': 'create'})),  #Получаем все данные и создаем
    re_path('^users3/(?P<id>\d+)/$',views.UserViewSet.as_view({'get': 'retrieve','put': 'update','delete': 'destory'})),  #Получаем один фрагмент данных и его обновления и удаляем его
    re_path('^api/',include(router.urls))
]
  1. тестовая функция
Язык кода:javascript
копировать
http://127.0.0.1:8000/myapp/api/     #Просмотр зарегистрированного списка URL-адресов
http://127.0.0.1:8000/myapp/api/user4/   #list,почта
http://127.0.0.1:8000/myapp/api/user4/2/ #Обновляем указанные данные идентификатора,удалить,Проверять

ModelКласс ViewSet

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

  • Пример: переопределить метод create() для изменения формата данных и ответа.
  1. Добавьте новое представление приложения: myapp/views.py.
Язык кода:javascript
копировать
from rest_framework.viewsets import ModelViewSet
class UserModelViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
  1. Внедрение маршрута приложения: myapp/urls.py
Язык кода:javascript
копировать
from django.urls import re_path,include
from myapp import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('user4',views.UserViewSet,'user4')
router.register('user5',views.UserViewSet,'user5')
router.register('user6',views.UserModelViewSet,'user6')    #Внедрить ModelViewSet

urlpatterns = [
    re_path('^users1/$', views.UserAPIView.as_view()),
    re_path('^users2/$',views.UserGenericAPIViews.as_view()),  #Получаем все данные и создаем
    re_path('^users2/(?P<id>\d+)/$',views.UserGenericAPIViews.as_view()),  #Получаем один фрагмент данных и его обновления и удаляем его
    re_path('^users3/$',views.UserViewSet.as_view({'get': 'list','post': 'create'})),  #Получаем все данные и создаем
    re_path('^users3/(?P<id>\d+)/$',views.UserViewSet.as_view({'get': 'retrieve','put': 'update','delete': 'destory'})),  #Получаем один фрагмент данных и его обновления и удаляем его
    re_path('^api/',include(router.urls))
]
  1. Тестирование интерфейса
Язык кода:javascript
копировать
http://127.0.0.1:8000/myapp/api/     #Просмотр зарегистрированного списка URL-адресов
http://127.0.0.1:8000/myapp/api/user6/  #list,create
http://127.0.0.1:8000/myapp/api/user6/  #update, delete, retrieve

Общие функции DRF

Основные методы аутентификации

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

HTTP — это протокол без сохранения состояния. Каждое посещение является новым. Раньше он использовался в основном для просмотра веб-страниц. С развитием времени, например, с появлением веб-сайтов онлайн-покупок, мы столкнулись с записью тех, кто входит в систему. систему и кто помещает товары в свои корзины. То есть всех надо различать, поэтому есть имя пользователя для их идентификации, но вам приходится входить в систему каждый раз, когда вы посещаете страницу, что очень хлопотно, поэтому происходит сохранение сеанса. Cookie+Session — это технология сохранения сеанса.

Token

Cookie+Session обычно более распространен, когда браузер выступает в качестве клиента. С популяризацией модели разработки разделения внешнего и внутреннего интерфейса в нем будут задействованы несколько терминалов (ПК, приложение, планшет), особенно мобильный терминал. не поддерживает файлы cookie, а файлы cookie не поддерживают междоменный доступ, поэтому, учитывая эти ограничения, токен постепенно становится основным.

JWT

Как и обычные токены, они являются токенами для доступа к ресурсам. Разница в том, что обычные серверы токенов должны запрашивать базу данных для проверки при проверке информации токена. JWT не нужно запрашивать базу данных для проверки информации токена, и ему нужно только использовать проверку ключа. на стороне сервера. Как и обычные токены, они являются токенами для доступа к ресурсам. Разница в том, что обычные серверы токенов должны запрашивать базу данных для проверки при проверке информации токена. JWT не нужно запрашивать базу данных для проверки информации токена, и ему нужно только использовать проверку ключа. на стороне сервера.

Сертификация ДФР

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

  • DRF поддерживает четыре метода аутентификации:
    • BasicAuthentication: аутентификация на основе имени пользователя и пароля, подходит для тестирования.
    • SessionAuthentication: аутентификация на основе сеанса.
    • TokenAuthentication: аутентификация на основе токенов.
    • RemoteUserAuthentication: удаленная аутентификация на основе пользователя.
  • DRF поддерживает разрешения:
    • IsAuthenticated: только вошедшие в систему пользователи могут получить доступ ко всем API.
    • AllowAny: разрешить всем пользователям
    • IsAdminUser: только администраторы.
    • IsAuthenticatedOrReadOnly: вошедшие в систему пользователи могут читать и писать API, не вошедшие в систему пользователи могут только читать.
Аутентификация сеанса DRF
  • Справочная документация: https://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication.

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

  1. Создайте новый встроенный фоновый пароль для входа в систему.
Глобальная аутентификация сеанса
  1. Глобальная конфигурация settings.py (просто добавьте конфигурацию): django_drf/settings.py
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}
  1. Перезапустить проект
  2. Тестовый доступ: http://127.0.0.1:8000/myapp/api/
  1. Войдите в фоновый режим: http://127.0.0.1:8000/admin/login/?next=/admin/
  1. Обновите представление API: http://127.0.0.1:8000/myapp/api/.
Частичная (просмотр) аутентификация сеанса
  1. Прокомментируйте конфигурацию сеанса Глобальной аутентификации в global settings.py.
  1. Измените функцию просмотра приложения: myapp/views.py.
Язык кода:javascript
копировать
from rest_framework.viewsets import ModelViewSet
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated

class UserModelViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    #Сертификация&Конфигурация разрешений
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
  1. Проверка URL-адреса, соответствующего представлению: http://127.0.0.1:8000/myapp/api/user6/
  1. Сравните http://127.0.0.1:8000/myapp/api/user5/
Сертификация токена
  1. В глобальные настройки.py добавлено новое приложение: django_drf/settings.py.
  1. Глобальная конфигурация Сертификация токена: django_drf/settings.py
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Сертификация
    'DEFAULT_AUTHENTICATION_CLASSES': [
        #'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    #Разрешения
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}
  1. Синхронизировать таблицу базы данных токенов
Язык кода:javascript
копировать
E:\workspace\django-project\day2\django_drf>python manage.py makemigrations
E:\workspace\django-project\day2\django_drf>python manage.py migrate
  1. Global urls.py настраивает URL-адрес интерфейса аутентификации: django_drf/urls.py.
Язык кода:javascript
копировать
from django.contrib import admin
from django.urls import path,include,re_path
from rest_framework.authtoken import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/',include("myapp.urls")),
    re_path('^auth_token/$', views.obtain_auth_token)
]
  1. Используйте apipost для генерации токена: http://127.0.0.1:8000/auth_token/
  1. Простой тест доступа: http://127.0.0.1:8000/myapp/api/user5/
  1. Тест с токеном: curl -H "Авторизация: токен ab87f8ab97dd0ffdd073546dea57c794ada6995e" http://127.0.0.1:8000/myapp/api/user5/
информация о пользовательском возврате токена
  • Необходимо переписать функцию возврата информации
  1. Добавьте информацию о перезаписи в каталог utils проекта приложения: myapp/utils/token_auth.py.
Язык кода:javascript
копировать
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.response import Response
from rest_framework.authtoken.models import Token

class CustomAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key, 'username': user.username})
  1. Измените конфигурацию токена в глобальных URL-адресах: django_drf/urls.py.
Язык кода:javascript
копировать
from django.contrib import admin
from django.urls import path,include,re_path
# from rest_framework.authtoken import views
from myapp.utils.auth_token import CustomAuthToken
urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/',include("myapp.urls")),
    re_path('^auth_token/$', CustomAuthToken.as_view())
]
  1. тест апипоста: http://127.0.0.1:8000/auth_token/

Ограничение тока

Частота доступа к интерфейсу может быть ограничена, чтобы снизить нагрузку на сервер.

Сценарии применения: голосование, количество покупок и т. д.

  • Официальная документация: https://www.django-rest-framework.org/api-guide/throttling/#throttling.
  1. Конфигурация глобальных настроек: django_drf/settings.py.
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Сертификация
    'DEFAULT_AUTHENTICATION_CLASSES': [
        #'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    #Разрешения
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    #Ограничение тока
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '10/minute',
        'user': '10/minute'
    }
}
  1. Перезапустить проект
  2. После 10 запросов апипоста в течение 1 минуты результаты следующие:

фильтр

  • Для данных списка, которые, возможно, потребуется отфильтровать на основе полей, мы можем улучшить поддержку, добавив расширение django-fitlter.
  • Справочная документация: https://www.django-rest-framework.org/api-guide/filtering/.
  1. Установка: Джанго-фильтр
Язык кода:javascript
копировать
pip3 install django-filter
  1. Новая конфигурация для глобальной конфигурации: djang_drf/settings.py.
  1. В глобальную конфигурацию добавлен фильтр: django_drf/settings.py.
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Сертификация
    # 'DEFAULT_AUTHENTICATION_CLASSES': [
    #     'rest_framework.authentication.SessionAuthentication',
    #     'rest_framework.authentication.TokenAuthentication',
    # ],
    #Разрешения
    # 'DEFAULT_PERMISSION_CLASSES': [
    #     'rest_framework.permissions.IsAuthenticated',
    # ],
    #Ограничение тока
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '10/minute',
        'user': '10/minute'
    },
    #фильтр Конфигурация    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
  1. Новое поле фильтра в представлении приложения: myapp/views.py.
Язык кода:javascript
копировать
from rest_framework.viewsets import ModelViewSet

class UserModelViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    #фильтр
    filter_fields = ('sex',)
  1. Тест страницы: http://127.0.0.1:8000/myapp/api/user6/?sex=%E7%94%B7

Поиск и сортировка

DRF предоставляет инструмент фильтра, который помогает нам быстро осуществлять поиск и сортировку.

  1. Продолжать изменять Новое поле фильтра в представлении приложения: myapp/views.py.
Язык кода:javascript
копировать
from rest_framework.viewsets import ModelViewSet
from rest_framework import filters

class UserModelViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    #фильтр
    filter_fields = ('sex',)
    #поиск&сортировать
    filter_backends = [filters.SearchFilter,filters.OrderingFilter]
    search_fields = ('name',)
    order_fields = ('age',)
  1. Тест: http://127.0.0.1:8000/myapp/api/user6/?search=%E5%BC%A0%E4%B8%89.

Пагинация

Пагинация — необходимая функция для таблиц данных.,Может быть реализован на переднем конце,Это также может быть реализовано на бэкэнде,Чтобы избежать слишком большого размера данных ответа,вызывая давление на переднюю часть,Обычно реализуется на бэкэнде.

  • Справочная документация: https://www.django-rest-framework.org/api-guide/pagination/#pagination.
Глобальная конфигурация пагинации
  1. Измените конфигурацию глобальных настроек: django_drf/settings.py.
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Ограничение тока
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '10/minute',
        'user': '10/minute'
    },#фильтр Конфигурация    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
    #globalПагинация
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 3   #Три фрагмента данных на странице
}
  1. Тестирование интерфейса: http://127.0.0.1:8000/myapp/api/user6/
Пользовательская пагинация Конфигурация
  1. 新增Пользовательская пагинация Конфигурация:myapp/utils/my_pagination.py
Язык кода:javascript
копировать
from rest_framework.pagination import PageNumberPagination
from collections import OrderedDict
from rest_framework.response import Response

class CustomPagination(PageNumberPagination):
    page_size = 10 #Сколько фрагментов данных отображается на каждой странице?
    page_query_param = 'page_num' #Запросить, какая страница данных
    page_size_query_param = 'page_size' #Сколько элементов отображается на странице?
    max_page_size = 50  #Максимальное количество явных записей на странице: 50
    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('total_num', self.page.paginator.count),
            ('next_page', self.get_next_link()),
            ('msg', 'success'),
            ('code',200),
            ('previous_page', self.get_previous_link()),
            ('data', data)
        ]))
  1. Измените конфигурацию глобальных настроек: django_drf/settings.py.
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Ограничение тока
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '10/minute',
        'user': '10/minute'
    },#фильтр Конфигурация    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
    # Пользовательская пагинация
    'DEFAULT_PAGINATION_CLASS': 'myapp.utils.my_pagination.CustomPagination'
}
  1. Тест пагинации: http://127.0.0.1:8000/myapp/api/user6/?page_size=2&page_num=2

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

Из-за отсутствия опыта разработки проектов или стремления выйти в онлайн требования постоянно меняются, а интерфейсы, определенные на этапе проектирования проекта, изменились до неузнаваемости. Это создает определенные трудности для фронтенд-разработчиков. Как улучшить. эта проблема?

  • Swagger уже здесь, это широко используемый инструмент автоматического создания документов REST API, сгенерированные документы могут быть просмотрены внешним персоналом.
  • Ссылка на документ: https://django-rest-swagger.readthedocs.io/en/latest/
  1. Установите django-rest-swagger
Язык кода:javascript
копировать
pip3 install django-rest-swagger
  1. Измените конфигурацию глобальных настроек: django_drf/settings.py.
  1. Измените конфигурацию глобальных настроек: django_drf/settings.py.
Язык кода:javascript
копировать
REST_FRAMEWORK = {
    #Ограничение тока
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '10/minute',
        'user': '10/minute'
    },#фильтр Конфигурация    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
    # Пользовательская пагинация
    'DEFAULT_PAGINATION_CLASS': 'myapp.utils.my_pagination.CustomPagination',
    #Документ интерфейса
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
  1. Настройте глобальную маршрутизацию: django_drf/urls.py
  1. Проверка доступа: http://127.0.0.1:8000/docs/
  1. Чтобы устранить вышеуказанную проблему: D:\devTools\python3\lib\site-packages\rest_framework_swagger\templates\rest_framework_swagger\index.html

Измените вторую строку staticfiles в index.html на static, чтобы решить проблему.

  1. Перезапустить тест проекта: http://127.0.0.1:8000/docs/
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода