Django 11. Пишем API - Обработчик запросов
В этом посте, мы напишем обработчик API-запросов от Telegram-бота.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 586344
Реклама
Продолжим предыдущий пост и напишем обработчик запросов.
Обработчик запросов.
Перейдём в файл 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 содержащий необходимые нам данные.
Все статьи