Рубрики
Без рубрики

Что я узнал, используя колбу в первый раз

Мое подчинение в Twilio X Dev Hackhathon!. Помечено Twiliohackathon, Python, Flask, Twilio.

Отслеживание мигрени с SMS (5 частью серии)

Счастливого четверга! Я надеюсь, что все идут хорошо. Мне понравилось работать через некоторые (HA, многих) вопросов, изучая колбу, чтобы интегрировать Python с API Twilio. На этой неделе я сосредоточусь на вопросах и учащихся, которые я впервые использовал колбу и твилио.

Быстрое повторение

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

Ссылка на код

Чтобы клонировать код, пожалуйста, посетите проект GitHub здесь Отказ Этот проект представляет собой текущую работу в процессе и не полностью функционален в это время, приложение прогуляется через опрос, но данные в данный момент не сохраняются нигде.

Вопросы и учащиеся

Проблемы порта

Первый вопрос, который я столкнулся с подключением к порту при запуске моего приложения, используя Python3 -m приложение запустить . Я столкнулся с этой проблемой в прошлом, когда я использую для работы на серверах и получит аналогичные сообщения на один ниже.

socket.error: [Errno 48] Address already in use 

Это просто означает, что процесс связан с портом, который я пытаюсь использовать. Это вызвано тем же приложением Python, которое называется ранее, и этот процесс все еще связан с портом. Чтобы исправить это, я посмотрел, какие процессы Python все еще работают, используя PS -FA |. Greep Python Отказ

Используя это, вы можете определить рабочий процесс Python, который все еще активен. Вы можете проверить, если http://localhost: / Все еще показывает список каталогов для локальных файлов. Второе число – это номер процесса, который вам нужно будет остановиться. Это можно сделать с помощью команды Убить Как в примере ниже:

ps -fA | grep python

>>  501 39548 16817   0  9:50PM ttys001    0:00.20 Python -m app run

kill 39548

>> [1]+  Terminated: 15          python3 -m app run

Что я здесь узнал? Это вызвано тем же приложением Python, которое называется ранее, и этот процесс все еще связан с портом. Это произошло только в два раза до сих пор, и это простое и быстрое исправление, чтобы просто убить процесс.

Тип и литье

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

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [08/Apr/2020 18:09:20] "POST /sms HTTP/1.1" 200 -
[2020-04-08 18:09:20,296] ERROR in app: Exception on /question/1 [GET]

TypeError: cannot unpack non-iterable NoneType object
127.0.0.1 - - [08/Apr/2020 18:09:20] "GET /question/1?

После первоначального поиска в этом выпуске было ясно, что результаты были повсюду. С этим я посмотрел на первый вопрос и закодировал то, что я ожидал, что происходит. Я установил Вопрос_id до 1, прочитайте в JSON для опроса и приняли решение вопроса в опрос, чтобы схватить вопрос о вопросе для нее. После возврата первого вопроса и его типа я напечатал информацию.

from parse import parseJson

question_id = 1
surv = parseJson('../survey.json')
question, type = surv.question_metadata(question_id) 
print(question)
print(type)

При запуске этого кода он произвел ожидаемые результаты, поэтому что-то было не так с тем, как Вопрос_id проходило. Чтобы воссоздать проблему за пределами приложения колба, я изменил Вопрос_id в строку вместо INT. Перезагружая этот код, воспроизвести ожидаемую ошибку:

TypeError: cannot unpack non-iterable NoneType object

Что я здесь узнал? Поэтому проблема была решена. Это была проблема типа, в которой я ожидал целое число и вместо этого принять строку. Не предполагайте, что тип передаваемого значения, сделайте его явным.

Секреты в колбе сессии

Как я уже упоминал, я не использовал колбу до того, как я ожидал, чтобы оказаться проблемами, изучающими, как его использовать. Основная проблема, которую я имел, когда изучение колбы было, как использовать секреты сеанса. После разрешения вышеуказанных проблем появился следующий, который возникла о том, что не имея сеанс секретной настройки.

    "The session is unavailable because no secret "
RuntimeError: The session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.

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

Что я здесь узнал? При исследовании сеансов Я узнал, что секретный ключ используется на сеансе для реализации на вершине файлов cookie и используется таким образом, чтобы данные не могли быть изменены без ключа, используемого для подписания. Вот еще больше информации о Сессии Отказ

Добраться до следующего вопроса

Последний вопрос, когда я пришел, когда я взаимодействовал с кодом, который я ранее разрабатывал, чтобы захватить опрос JSON и прочитал его. При внедрении этого кода и попытка добраться до следующего вопроса в опросе, я столкнулся с двумя основными проблемами, которые я имел при работе с вопросами обследования:

  1. Как выяснить, был ли другой вопрос в JSON или не основан на сохраненном в настоящее время Вопрос_id ?
  2. Что делает приложение, если есть другой вопрос? Что делает приложение, если нет другого вопроса?

С этим давайте посмотрим на вопрос 1, как вы используете Вопрос_id определить, существует ли другой вопрос. Начать, я оглянулся на функцию, которую я создал в Parse.py Чтобы увидеть, как я собирал данные и использовал объект фильтра, который выхватил вопрос, идентификатор которого соответствует и вернет корпус и тип данных.

 try:
            survey_dict = self._json_to_dict()['questions']
            data = list(filter(lambda item: item['id'] == question_id, survey_dict))

            if data:
                return data[0]['body'], data[0]['type']
        except:
            print("The index povided for the question does not appear to exist.")

После некоторого дальнейшего чтения в этом разделе кода я изменил линию, которая фильтрует к способу, который вернет список вместо объекта фильтра. Линия Фильтр (функция, утечка) эквивалентно [Пункт для элемента в Iterable, если функция (товар)] Это означает, что я могу изменить код для замены:

data = [item for item in survey_dict if (item['id'] == question_id)]

Это более питонический способ найти следующий вопрос в JSON, в котором мы читаем.

С этим мы можем получить на вопрос 2, что приложение делает сейчас, что у него есть данные для следующего вопроса? Данные, возвращенные для следующего вопроса, либо Нет или информация следующего вопроса. Используя Вопрос_id , Ответ () Функция считывается в данном идентификаторе вопроса (пример: Вопрос 1 возвращает 1), а затем итерации на следующие вопросы ID на 1. Следовательно, когда предусмотрен вопрос 1, следующий идентификатор будет 2. Мы используем это ID, 2 и кормить его в Over.Question_Metadata () Функция, которая выглядит, чтобы увидеть, если данные возвращаются, это ни один или другой вопрос.

Прежде чем продолжить эти данные собранные, Ответ () Функция выдает контент из предыдущего вопроса и сохраняет его, что будет обсуждаться на следующей неделе. После хранения данных функция выглядит, чтобы увидеть, если данные для следующего вопроса нет, что завершит обследование, или то, если данные содержит следующий вопрос, затем передает идентификатор вопроса и передает идентификатор Redirect_twiml () который будет обрабатывать ответ на пользователя.

@app.route("/answer/", methods=["POST"])
def answer(question_id):

    id = int(question_id) + 1 # Cast to an int, comes in as a string
    data = surv.question_metadata(id) # Return first question
    data_collected.append(str(extract_content())) # Append the data collected

    if data:
        return redirect_twiml(id)
    else:
        return goodbye_twiml()

Что я здесь узнал? После выполнения этих двух проблем я получил лучшее понимание в том, как Flask работает для перенаправления от одной функции к следующему, и как мне нужно правильно настроить опрос, чтобы правильно перенаправить, когда пользователь ответил на каждый вопрос. За это время я начал больше понимать о Сессии Также я говорил ранее. Самый маленький тидбит информации, у которого я убрал этот вопрос, заключалась в том, что линия Фильтр (функция, утечка) эквивалентно [Пункт для элемента в Iterable, если функция (товар)] который является более питонным способом работать с данными.

Стек для развития

До сих пор я работал над кодом, необходимым для взаимодействия с API Google API и API Twilio в приложении Flask …

Оставайтесь на сегодняшний день на следующие недели, где я обсуждаю, как я интегрирую два API вместе в приложении Python Flask, который генерирует обследование для мигрени. Я с нетерпением жду совместного использования с вами вопросы и учащиеся, которые я столкнулся, в то время как учатся использовать колбу с этими API!

Дополнительные ресурсы

Ссыловые ссылки

Остальное API Twilio Автоматизированное обследование – Python Flask App Github образец автоматической обследования NGROK Как получить SMS в Python с Twilio Отслеживание разговоров SMS

Отслеживание мигрени с SMS (5 частью серии)

Оригинал: “https://dev.to/rosejcday/setting-up-twilio-with-flask-and-testing-surveys-3e9k”