Создание простого SMS-приложения с использованием Twilio и Django

Автор: | 28.07.2026

Django — мой личный выбор при разработке веб-приложений, поскольку я обожаю огромную коллекцию сторонних библиотек и прекрасное сообщество, развивающее этот программный продукт. Когда я задумываюсь о том, как должны работать веб-фреймворки архитектуры MVC, Django подходит под это описание практически идеально. Давайте создадим простое приложение, которое отвечает SMS-сообщением, когда вы отправляете ему SMS.

В этом посте мы будем использовать Django для создания простого SMS-приложения:

— Привязка номера телефона Twilio к вашему веб-приложению на Django

— Ответ на SMS-сообщение с использованием базового TwiML

— Использование twilio-python для создания ответов в стиле Python

— Использование django-twilio для обеспечения безопасного ответа со стороны Django

Twilio использует вебхуки для связи с нашим приложением: когда Twilio получает SMS, он отправляет HTTP-запрос на URL-адрес нашего веб-приложения. Затем мы возвращаем ответ, который Twilio преобразует в SMS-сообщение или телефонный звонок.

Как и любое другое устройство в телефонной сети, вам понадобится номер телефона для отправки и получения SMS. Вы можете перейти на портал управления аккаунтом Twilio и получить его бесплатно, используя пробную учетную запись. Нам нужно указать наш URL-адрес в портале управления аккаунтом в поле Request URL в конфигурации нашего номера телефона:

В этом руководстве мы будем использовать URL-адрес /sms/. Если вы хотите разместить свою локальную среду разработки в сети, я рекомендую использовать ngrok.

Получив запрос от Twilio, Django проверит конфигурацию URL-адресов, чтобы решить, в какое представление (view) передать информацию о запросе. Затем это представление отправляет наш ответ обратно в Twilio.

Для этого нам потребуется создать новый проект Django, поэтому выполните следующий код в терминале для его настройки:

Мы используем имя проекта djtwilio (в основном потому, что это звучит как имя крутого диджея), но вы можете использовать любое другое имя для своего проекта. Просто не забудьте заменять djtwilio на имя вашего проекта во всем коде.

Нам нужно определить URL-адреса в нашей конфигурации URL перед написанием остального кода, иначе запрос никуда не пойдет:

Здесь мы настроили конфигурацию так, чтобы связать URL-адрес /sms/ с представлением sms_received. В Django представление может быть функцией. Вы также можете использовать классовые представления (class-based views), но в этом примере мы будем использовать функциональные представления (function-based views).

Теперь мы можем приступить к созданию нашей функции-представления в файле views.py:

Функции-представления в Django всегда должны принимать хотя бы один параметр: объект request. Он передается в функцию вместе с такой информацией, как параметры HTTP-заголовков, данные POST-форм и кучей других вещей. Пока нас это не интересует, но Django требует этого.

Twilio использует TwiML — набор XML-тегов, которые Twilio интерпретирует как инструкции.

Это означает, что мы можем создать такую строку:

И Twilio преобразует ее в SMS-сообщение, словно по волшебству. Здесь наш ответ — это сообщение с простым текстом. TwiML делает реализацию этих сложных телефонных действий смехотворно простой.

Наконец, мы возвращаем нашу строку TwiML в объекте HttpResponse. Это стандартный метод отправки HTTP-ответов в Django:

Поскольку мы возвращаем XML, стандарты HTTP гласят, что нам следует установить тип содержимого text/xml. В конце концов, мы хотим соблюдать правила веб-пространства.

Запустите сервер через командную строку:

Теперь, если вы попытаетесь отправить SMS на номер, привязанный к этому представлению, вы увидите ошибку.

О нет! У Twilio есть отличный монитор приложений (App Monitor), который отслеживает для вас ошибки, чтобы вы могли видеть, где что-то идет не так. Если мы посмотрим на эту ошибку в мониторе приложений, то увидим следующее:

Дальнейшее изучение этой ошибки покажет, что мы получили ответ 403 Forbidden.

Поскольку Django строго относится к безопасности, особенно когда речь идет об HTTP POST-запросах, он требует токен CSRF для проверки запросов. Чтобы обойти это, вам нужно добавить декоратор csrf_exempt в строку над вашей функцией-представлением:

Разработчики, читающие это, вероятно, обеспокоены использованием csrf_exempt в этом представлении, так как это отключает любую аутентификацию и проверку безопасности. Мы бы никогда не стали делать этого в рабочей среде (production), поэтому здесь мы используем это только в качестве примера. Далее мы предложим безопасное решение, специфичное для Twilio.

Окончательный код (включая импорты) для ответа на SMS-сообщение выглядит так:

Если мы сейчас попытаемся отправить SMS-сообщение на наш номер, мы сможем проверить, получаем ли мы ответ.

Бум. Это работает.

Разве не было бы проще, если бы нам не приходилось запоминать, какие именно глаголы TwiML нужно использовать? Иногда эти строки могут быть огромными, и вероятность написания некорректного XML увеличивается по мере роста ответов.

Twilio предоставляет вспомогательные библиотеки на различных языках, таких как Python, Ruby, Java и C#. Пакет twilio-python может помочь нам создавать ответы TwiML с помощью своего класса MessagingResponse.

Мы можем установить twilio-python с помощью pip:

Давайте посмотрим, как twilio-python может упростить наш предыдущий пример кода.

Это дает нам более чистый код, который также является довольно питоничным. Нет необходимости писать XML вручную: мы просто добавляем различные глаголы к объекту ответа и возвращаем его, когда закончим.

Пакет twilio-python упрощает создание TwiML, но как насчет специфичных для Django функций? И что насчет той большой дыры в безопасности с токенами CSRF? Есть ли способ упростить использование Twilio в Django? Конечно есть!

Django-twilio, созданный Рэндаллом Деггесом (Randall Degges), предоставляет набор декораторов для представлений, которые возвращают TwiML или получают информацию от Twilio. Мы можем использовать эти декораторы, чтобы еще больше очистить код в нашей функции-представлении.

Как и вспомогательную библиотеку Python для Twilio, мы можем установить его с помощью pip:

Вот предыдущий пример кода, измененный в последний раз для включения django-twilio и его функций:

Декоратор представления twilio_view дает несколько серьезных преимуществ:

1. Он гарантирует, что запросы, отправляемые в представление, исходят только от twilio.com, что предотвращает подделку (spoofing) запросов злоумышленниками.

2. Он отключает исключение CSRF в пользу безопасности из пункта 1, что на самом деле гораздо надежнее.

3. Он отправляет ваш ответ обратно в объекте HttpResponse с соответствующим типом содержимого.

4. Наконец, он работает в режиме отладки Django. Вы можете тестировать представления как обычные веб-страницы, даже с декоратором twilio_view, просто установив DEBUG = True.

Теперь, когда мы умеем отвечать на SMS, давайте разберемся, что Twilio отправил нам в запросе, и ответим персонализированным сообщением. Это одна из моих любимых функций Twilio: все данные, доставляемые вам, выглядят как обычный HTTP-запрос POST или GET.

В верхней части наших представлений добавьте новые импорты:

С помощью Django мы можем получить содержимое из заголовков POST-запроса с помощью следующего кода:

Это смотрит данные HTTP-запроса и возвращает содержимое SMS (значение Body), в противном случае просто возвращает пустую строку. Затем мы можем отправить обратно персонализированное сообщение:

Так что когда я отправляю SMS-сообщение со своим именем, я получаю SMS-ответ вроде этого:

*Привет, Пол, как ты сегодня?*

Полный код для этого, с выделенными новыми строками:

Мы продемонстрировали основы получения и ответа на SMS-сообщения с помощью Twilio и Django. Теперь у вас должны быть фундаментальные знания, необходимые для создания сложных систем, использующих телефонную сеть: сервисы подписки на основе SMS (opt-in/opt-out), проведение опросов через SMS или даже текстовые приключенческие игры по SMS, такие как Zork. Идите и экспериментируйте с Twilio API, чтобы увидеть, что вы можете создать; попробовать это ничего не стоит.

Код для этой статьи можно найти на Github, так что смело делайте форк и используйте его как основу для своего собственного приложения.

Мы продолжим эту серию постов, связанных с Django, через несколько недель, продемонстрировав, как создавать конференц-центры. А пока, мои коллеги-джангонавты: наслаждайтесь вашими новыми навыками.