REST API с аутентификации по токену. Токены должны быть двух типов — пользовательские и администраторские. Пользовательские токены позволяют только просматривать модели, но не изменять их. Методы, вызывающие Fetcher и IncidentPredictor, должны быть ограничены по количеству запросов в секунду (RPS). Администраторские токены не имеют ограничений на изменения и имеют свои ограничения по RPS.
Модели
IncidentType: Разрешить только изменения полей description, chat_gpt_prompt и is_active. Запретить создание и удаление.
MediaIncident, Source и Article: Реализовать полные CRUD-операции.
API Endpoints
IncidentType
GET /incident-types/
GET /incident-types/{id}/
PUT /incident-types/{id}/ (только для администраторов)
MediaIncident
GET /media-incidents/
GET /media-incidents/{id}/
POST /media-incidents/ (только для администраторов)
PUT /media-incidents/{id}/ (только для администраторов)
DELETE /media-incidents/{id}/ (только для администраторов)
GET /media-incidents/by-article/{article_id}/
Source
GET /sources/
GET /sources/{id}/
POST /sources/ (только для администраторов)
PUT /sources/{id}/ (только для администраторов)
DELETE /sources/{id}/ (только для администраторов)
GET /sources/{id}/articles/
GET /sources/{id}/media-incidents/
Article
GET /articles/
GET /articles/{id}/
POST /articles/ (только для администраторов)
PUT /articles/{id}/ (только для администраторов)
DELETE /articles/{id}/ (только для администраторов)
GET /articles/by-media-incident/{media_incident_id}/
POST /articles/fetch-and-predict/ (разные RPS для пользователей и администраторов)
Задачи
Настройка Django REST Framework и DRF Token Auth
Добавить djangorestframework и rest_framework.authtoken в INSTALLED_APPS.
Настроить аутентификацию по токену в settings.py.
Создать новое Django приложение под названием api.
Создание сериализаторов
Создать сериализаторы для моделей IncidentType, MediaIncident, Source и Article в api/serializers.py.
Создание ViewSet-ов с ограничениями по ролям
Создать ViewSet-ы для моделей IncidentType, MediaIncident, Source и Article в api/views.py.
Добавить пользовательские пермишены для ограничения доступа на основе токенов.
Создание URL-ов
Определить маршруты для API в api/urls.py.
Реализация Fetch и Predict эндпоинта с ограничением по RPS
Создать пользовательский эндпоинт в api/views.py для приема URL статей, создания объектов Article и вызова Fetcher.fetch_article(article) и IncidentPredictor.predict(article) с ограничением по RPS.
Настройка прав доступа и ограничений по RPS
Установить соответствующие права доступа для каждого эндпоинта в api/views.py.
Настроить middleware для ограничения RPS.
Обновление главного URL-файла
Включить URL-ы API в главный urls.py проекта.
Тестирование
Написать тесты для всех эндпоинтов в api/tests.py.
# api/serializers.py
from rest_framework import serializers
from server.apps.core.models import IncidentType, MediaIncident, Source, Article
class IncidentTypeSerializer(serializers.ModelSerializer):
class Meta:
model = IncidentType
fields = ['id', 'description', 'chat_gpt_prompt', 'is_active']
class MediaIncidentSerializer(serializers.ModelSerializer):
class Meta:
model = MediaIncident
fields = '__all__'
class SourceSerializer(serializers.ModelSerializer):
class Meta:
model = Source
fields = '__all__'
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
Создание ViewSet-ов с ограничениями по ролям
# api/permissions.py
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsAdminOrReadOnly(BasePermission):
def has_permission(self, request, view):
if request.method in SAFE_METHODS:
return True
return request.user.is_staff
class IsAdminOrRestrictedPost(BasePermission):
def has_permission(self, request, view):
if request.method in SAFE_METHODS:
return True
if request.method == 'POST':
return request.user.is_staff
return request.user.is_staff
# api/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import IncidentTypeViewSet, MediaIncidentViewSet, SourceViewSet, ArticleViewSet
router = DefaultRouter()
router.register(r'incident-types', IncidentTypeViewSet)
router.register(r'media-incidents', MediaIncidentViewSet)
router.register(r'sources', SourceViewSet)
router.register(r'articles', ArticleViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Настройка прав доступа и ограничений по RPS
Настроить права доступа для каждого ViewSet-а в api/views.py.
Настроить middleware для ограничения RPS.
Обновление главного URL-файла
# server/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]
Тестирование
Написать тесты для всех эндпоинтов в api/tests.py используя тестовый фреймворк Django и APIClient из DRF.
Как генерируются пользователи по токенам
Для генерации токенов для пользователей используется rest_framework.authtoken. После добавления rest_framework.authtoken в INSTALLED_APPS и выполнения миграций, можно создать токены для существующих пользователей с помощью команды:
python manage.py drf_create_token <username>
Эта команда создаст и выведет токен для указанного пользователя. Пользовательские токены могут быть использованы для аутентификации при запросах к API, добавляя токен в заголовок запроса:
Authorization: Token <user_token>
Токены могут быть различными для администраторов и обычных пользователей, что позволяет реализовать разные уровни доступа и ограничения по RPS.
Создание REST API для Django проекта
Описание
REST API с аутентификации по токену. Токены должны быть двух типов — пользовательские и администраторские. Пользовательские токены позволяют только просматривать модели, но не изменять их. Методы, вызывающие
Fetcher
иIncidentPredictor
, должны быть ограничены по количеству запросов в секунду (RPS). Администраторские токены не имеют ограничений на изменения и имеют свои ограничения по RPS.Модели
description
,chat_gpt_prompt
иis_active
. Запретить создание и удаление.API Endpoints
IncidentType
MediaIncident
Source
Article
Задачи
Настройка Django REST Framework и DRF Token Auth
djangorestframework
иrest_framework.authtoken
вINSTALLED_APPS
.settings.py
.api
.Создание сериализаторов
IncidentType
,MediaIncident
,Source
иArticle
вapi/serializers.py
.Создание ViewSet-ов с ограничениями по ролям
IncidentType
,MediaIncident
,Source
иArticle
вapi/views.py
.Создание URL-ов
api/urls.py
.Реализация Fetch и Predict эндпоинта с ограничением по RPS
api/views.py
для приема URL статей, создания объектовArticle
и вызоваFetcher.fetch_article(article)
иIncidentPredictor.predict(article)
с ограничением по RPS.Настройка прав доступа и ограничений по RPS
api/views.py
.Обновление главного URL-файла
urls.py
проекта.Тестирование
api/tests.py
.Подробные шаги
Настройка Django REST Framework и DRF Token Auth
Создание сериализаторов
Создание ViewSet-ов с ограничениями по ролям
Настройка прав доступа и ограничений по RPS
api/views.py
.Обновление главного URL-файла
Тестирование
api/tests.py
используя тестовый фреймворк Django и APIClient из DRF.Как генерируются пользователи по токенам
Для генерации токенов для пользователей используется
rest_framework.authtoken
. После добавленияrest_framework.authtoken
вINSTALLED_APPS
и выполнения миграций, можно создать токены для существующих пользователей с помощью команды:Эта команда создаст и выведет токен для указанного пользователя. Пользовательские токены могут быть использованы для аутентификации при запросах к API, добавляя токен в заголовок запроса:
Токены могут быть различными для администраторов и обычных пользователей, что позволяет реализовать разные уровни доступа и ограничения по RPS.