Написание собственного API для блога — это полезный навык, который позволяет лучше понять принципы построения RESTful API и их взаимодействия с фронтендом. Используем Django и Django REST framework (DRF) для создания API, который будет обрабатывать CRUD-операции для постов блога. Разберем создание моделей, сериализацию данных, настройку маршрутов и контроллеров, а также добавим несколько лайфхаков для удобства разработки и безопасности.
Подготовка окружения
Перед началом убедитесь, что у вас установлены Django и Django REST framework. Если нет, установим их через pip:
pip install django djangorestframework
Создадим проект и приложение для нашего блога:
django-admin startproject blog_projectcd blog_projectdjango-admin startapp blog
Зарегистрируем наше приложение и rest_framework
в INSTALLED_APPS
в settings.py
:
# blog_project/settings.pyINSTALLED_APPS = [ # остальные приложения 'rest_framework', 'blog',]
Шаг 1. Создание моделей для блога
Определим модель для поста блога с полями для заголовка, содержимого и даты публикации.
# blog/models.pyfrom django.db import modelsclass Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title
Выполним миграции, чтобы создать таблицу в базе данных:
python manage.py makemigrationspython manage.py migrate
Шаг 2. Настройка сериализаторов
Создадим сериализатор для модели Post
:
# blog/serializers.pyfrom rest_framework import serializersfrom .models import Postclass PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ['id', 'title', 'content', 'created_at']
Шаг 3. Создание представлений для API
Используем ModelViewSet
для автоматического создания методов CRUD:
# blog/views.pyfrom rest_framework import viewsetsfrom .models import Postfrom .serializers import PostSerializerclass PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all().order_by('-created_at') serializer_class = PostSerializer
Шаг 4. Настройка маршрутов
Теперь подключим маршруты для нашего API:
# blog/urls.pyfrom django.urls import path, includefrom rest_framework.routers import DefaultRouterfrom .views import PostViewSetrouter = DefaultRouter()router.register(r'posts', PostViewSet)urlpatterns = [ path('', include(router.urls)),]
Добавим blog/urls.py
в основной файл маршрутов:
# blog_project/urls.pyfrom django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('api/', include('blog.urls')),]
Шаг 5. Лайфхаки для улучшения API
1. Пагинация
Добавим пагинацию, задав количество элементов на странице в settings.py
:
# blog_project/settings.pyREST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10,}
2. Фильтрация и поиск
Добавим фильтрацию и поиск по заголовку поста:
# blog/views.pyfrom rest_framework import viewsets, filtersfrom django_filters.rest_framework import DjangoFilterBackendfrom .models import Postfrom .serializers import PostSerializerclass PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all().order_by('-created_at') serializer_class = PostSerializer filter_backends = [DjangoFilterBackend, filters.SearchFilter] filterset_fields = ['created_at'] search_fields = ['title']
Шаг 6. Тестирование API
Настройте Postman или используйте команду curl
для тестирования:
curl -X POST http://localhost:8000/api/posts/ \ -H "Content-Type: application/json" \ -d '{"title": "Первый пост", "content": "Содержание первого поста"}'
Шаг 7. Безопасность и авторизация
Добавим JWT авторизацию:
pip install djangorestframework-simplejwt
Подключаем JWT в settings.py
:
# blog_project/settings.pyREST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ),}
Добавим маршруты для получения токена:
# blog/urls.pyfrom rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView,)urlpatterns += [ path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),]
Заключение
Мы создали полноценный REST API для блога, настроили маршруты, добавили пагинацию, фильтрацию и авторизацию. Такой API легко подключить к фронтенду, будь то мобильное приложение или SPA (например, на React или Vue).
Теперь у вас есть базовый API для блога, который можно легко адаптировать и расширять.
Написать комментарий