Cat

Django 11. Пишем API - Обработчик запросов

В этом посте, мы напишем обработчик API-запросов от Telegram-бота.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 10 Август 2023 Просмотров: 892

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

 

Обработчик запросов.

Перейдём в файл api.py
Создадим класс GetFilePath наследуемый от APIView

Мы будем обрабатывать GET запрос, то есть бот отправит запрос на получение данных, поэтому создадим в классе статический метод get принимающий в качестве атрибута request - HTTP-запрос.

Можно создавать не только GET, но и POST, PUT, DELETE и другие типы HTTP-запросов.

 

Query-параметры.

В запросе, мы будем использовать query-параметры. Они передаются вместе с запросом добавляя в URL-адрес символ вопроса ? и перечисление именованных переменных, разделённых между собой знаком амперсанда &.
Например, ⁣https://pressanybutton.ru/?code=123, где code параметр, а 123 его значение.

 

Обработка запроса.

Создадим переменную code в которую будем получать из запроса значение одноимённого параметра.

Во избежание ошибок, если вдруг пользователь введёт не существующий код файла, обернём дальнейший код в try-except.

Внутри блока try создадим переменную file, в которую получим объект модели с совпадающим кодом. Если объект не будет найден, то дальнейший код не сработает и нас выбросит на обработку исключения, о ней чуть позже.

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

Обработав все данные можно возвращать пользователю ответ, передав в качестве ответа JSON представление сериализованных данных.

В случае если, объект по запрошенному коду не найден, провалившись в блок except, мы сразу делаем возврат пустого значения пользователю со статус-кодом 404.
 

Код обработчика:

from django.core.exceptions import ObjectDoesNotExist
from rest_framework.response import Response
from rest_framework.views import APIView

from . import models, serializers


class GetFilePath(APIView):
    @staticmethod
    def get(request):
        code = request.GET.get('code')
        try:
            file = models.PostFilesModel.objects.get(code=code)
            file.increment_download_count()
            serialized_data = serializers.FileModelSerializer(file)
            return Response(serialized_data.data)
        except ObjectDoesNotExist:
            return Response(None, status=404)

 

URL-паттерн для API.

Обработчик написан, осталось только прописать URL-паттерн для обращения к нашему API.

Перейдём в файл urls.py нашего приложения. Что бы отделить паттерны страниц от паттернов API, под переменной urlpatterns, сделаем ещё одну с таким же именем. Только вместо = добавим сложение списков +=.
 

В новой переменной, определим список и добавим в него переменную объект паттерна.

 

Код urls.py.

from django.urls import path

from . import views, api

app_name = 'blog'
# Паттерны сайта
urlpatterns = [
    path('', views.index, name='index'),
]

# Паттерны API
urlpatterns += [
    path('bot/get-file/', api.GetFilePath.as_view()),
]

 

Проверяем работу.

Теперь, запустив Django и обратившись с GET запросом при помощи программы Postman или библиотеки requests по пути http://127.0.0.1:8000/bot/get-file/?code=0 получим в ответ JSON содержащий необходимые нам данные.

Автор

    Нет комментариев

    Реклама