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

Платформы, практические проекты на Python и сбор колбы: История блога

В основном это мои необработанные заметки из недавнего проекта, который я сделал, который был отклонен, но в конечном итоге приобрел новые навыки с помощью Flask

Автор оригинала: Mike Bell.

Предупреждение: используется необработанный язык. У меня иногда грязный рот. Не читайте, если вам не нравится, когда используется язык взрослых. Я здесь сырой и нефильтрованный, как и в реальной жизни!

Примечание для всех, кто интересуется метриками: sh*t появляется 7 раз, f*ck появляется дважды.

Я в первую очередь программист. Мне платили за разработку таких вещей, как приложение для iOS. Мне также платили за исправление ошибок в больших корпоративных приложениях iOS. Кроме того, мне платили за написание скриптов на Python и выполнение пентестов на iOS, Android и веб-приложениях.

Существует огромная разница между моим набором навыков и наборами навыков “реальных разработчиков”.

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

Я склонен подбирать то, что мне нужно и/или о чем меня просят. Я узнал о широком спектре инструментов и ролей, которые может занимать “разработчик”. Там много чего есть, и будь я проклят, если от меня ожидают, что я изучу такие мусорные цепочки инструментов, как “React.js” это полностью противоречит всему моему подходу к минимизации дерьма.

Недавно я подал заявку на то, чтобы попасть на платформу определенного веб-сайта, и после случайной беседы с инженером меня попросили построить “небольшой” (для меня в то время он не был маленьким) бэкенд-проект. Вам даны некоторые конечные точки REST, подробные сведения о том, как это должно работать (хотя и недостаточно подробностей), и некоторые примеры ввода/вывода для управления вещами. Вам дают подсказки о дизайне объекта. Вам решать, как его построить.

Поэтому, поскольку я люблю Python и хотел, чтобы все было “гибким”, я решил изучить что-то под названием “Колба”.

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

Для этого проекта я зашел в блог heavy .

Я изменил имена конечных точек REST и удалил URL-адреса, которые намекают на проект. Я думаю, что было бы очень “неправильно” ожидать, что я НЕ поделюсь своими исследованиями и недавно приобретенными инструментами и навыками с остальным миром, поэтому от меня этого нельзя ожидать, поэтому я проявил должную осмотрительность, чтобы скрыть любые “значимые” детали.

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

Refresh JWT

POST /some-token-endpoint/refresh
-----
User login

POST /some-token-endpoint
-----
Log out current user

DELETE /some-token-endpoint
-----
Get current user's info

GET /myinfo
-----
Create idea

POST /getideas
-----
Delete idea

DELETE /getideas/:id
-----
Get a page of ideas (1 page = 10 ideas)

GET /getideas
-----
Update idea

PUT /getideas/:id
-----
User Signup

POST /getusers

Это кажется достаточно простым, но самое трудное-просто начать. Мы можем использовать flask для определения каждой из конечных точек API. Мы не перечисляем его в API, но подразумевается страница входа в |//.

Текущий день и время: Сб 23 февраля 2019 22:55 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 12m 30s Общее затраченное время: 12m30s

При каждом новом обновлении/записи в этом блоге мы будем добавлять текущий день/время, дату доставки, а также текущее и общее затраченное время

Полезные ссылки для этого проекта

Текущий день и время: Пн 25 февраля 2019 01:33 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 1 час 20 минут Общее затраченное время: 1 час 32 минуты

Созданы начальные страницы.

/
/user_registration
/getusers
/some-token-endpoint

Скоро Тодо:

  1. Обработка регистрации пользователей
    • первоначальное создание базы данных
    • обновление базы данных
  2. Обработка входа пользователя в систему
  3. Обработка выхода пользователя из системы

Продолжающийся…

Каким-то образом моя колба больше не связана с Python, и у меня установлено слишком много версий, поэтому я собираюсь потратить время на очистку своих установок Python, удалив существующие, а затем установив их с нуля с помощью brew.

Текущий день и время: Пн 25 февраля 2019 23:46 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 44m 01s Общее затраченное время: 1hr44m33m

Я исправил настройку колбы…съел немного времени…И Python3 тоже.

Я переместил часть кода, но не добился большого прогресса.

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

Сейчас мы потратим на это время.

Итак, хорошая идея-это шаблоны.

Мы должны сделать это сейчас.

Хорошо, нам удалось плавно перейти к системе шаблонов страниц, и кажется естественным создавать страницы и управлять ими таким образом.

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

user table:
user_id - email - password_hash

user_id может ссылаться на другое содержимое таблицы, чтобы мы могли хранить идеи, возможно, в объекте blob или что-то в этом роде?

Я не уверен, каков “лучший” способ сделать это, поэтому мне придется разобраться в этом.

Текущий день и время: Вт 26 февраля 2019 00:14 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 24m08s Общее затраченное время: 2hr08m41m

Установлен колба-wtf .

Перемещал вещи, чтобы быть более “правильным”.

Структура приложения:

xxxxx/
  config.py
  xxxxx.py
  run.sh

  app/
    __init__.py
    routes.py

    templates/
      index.html
      user_registration.html
      users.html

Все по-прежнему строится и работает нормально.

Нам все еще нужно зарегистрироваться, но мы следуем учебнику.

Надо почитать, прежде чем мы нырнем.

Проверка времени.

Текущий день и время: Чт 28 февраля 2019 02:21 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 28m 11s Общее затраченное время: 2hr36m52m

Немного углубился в строительные формы.

Фактический объект LoginForm ().

Текущий день и время: Чт 28 февраля 2019 02:48 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 25m 47s Общее затраченное время: 3hr01m39m

Мы немного продвинулись вперед, но теперь реализуем сообщения об ошибках, когда пользователь вводит неверные данные формы.

Форма входа() и Регистрационная форма() .

Делаю перерыв, чтобы поспать.

Текущий день и время: Чт 28 февраля 2019 03:28 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 39m 12s Общее затраченное время: 3hr40m51m

My xxxxx:

______________________________
usermode: 10
trial: 10
continental: 10
averaje: 10

OK Cancel

Я, НАКОНЕЦ, продвинулся через раздел базы данных учебника:

Я создал User и Idea “модель”, которая в основном является определением таблицы.

Чтобы исправить БД, когда мы меняем дерьмо:

flask db migrate
flask db upgrade 

Когда вы вносите изменения, вы можете комментировать их

flask db migrate -m "your comment"

Теперь, когда мы это сделали, мы готовы начать работать с логинами:

Мы много работали, и поэтому нам следует сделать перерыв.

Текущий день и время: Чт 28 февраля 2019 22:06 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 1 час 42 минуты 57 секунд Общее затраченное время: 4 часа 23 минуты 48 секунд

Текущая разница:

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

Текущий день и время: Пт 1 марта 2019 02:46 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее время: 1 час 29 минут 23 секунды Общее время: 5 часов 53 минуты 11 секунд

Нам все еще нужно проверить оболочку и войти в систему с этого уровня.

Тьфу дерьмо сломано

ДА

У НАС ВЗЛЕТ!!!

Я протестировал форму входа в систему, и она работает, как и ожидалось.

Это снова какое – то волнение!

Мы можем сделать перерыв. Нужно очистить голову и подготовиться к следующим шагам.

Текущий день и время: Пт 1 марта 2019 03:29 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 40m 48s Общее затраченное время: 5hr04m36s

Следующие шаги:

  • Регистрация пользователя легко
  • Воплощайте идеи в жизнь
    • Добавьте идею
    • Удалить идею
    • Отображение идей

Ладно, пора выкинуть это дерьмо из головы! Регистрация пользователя! У нас это работает. Вы можете немедленно создать нового пользователя и немедленно войти в систему с ним. Идеалист-это все, что остается. Давайте остановимся и продолжим.

Текущий день и время: Пт 1 марта 2019 23:36 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее время: 22m 48s Общее время: 5hr28m04s

  • Воплощайте идеи в жизнь
    • Добавьте идею
    • Удалить идею
    • Отображение идей

При успешной регистрации пользователя мы должны перевести его на страницу “Мои идеи”.

Я думаю, что на самом деле мне нужно реализовать только конечные точки, а не сами страницы -_- упс!

Хорошо…

Давайте все перестроим.

Сначала я регистрирую пользователя.

Если я смогу проверить это в curl…сначала мне нужно исправить curl…заварите завиток…

Хорошо…

Отчет о ходе работы:

У меня есть POST/get users , отражающие наши входные данные.

Нам нужно, чтобы он вычислял токен jwt и refresh_token и возвращал его в виде json.

{
  "jwt" : "...",
  "refresh_token" : "..."
}

Похоже, для этого мы можем использовать Flask-JWT .

Похоже, для этого мы можем использовать || Flask-JWT||.

У меня он установлен и вроде как встроен в routes.py но я ошибаюсь при попытке аутентификации в /auth

./run.sh           
 * Serving Flask app "xxxxx.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[2019-03-02 02:56:46,265] ERROR in app: Exception on /auth [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python3.7/site-packages/flask_jwt/__init__.py", line 115, in _default_auth_request_handler
    username = data.get(current_app.config.get('JWT_AUTH_USERNAME_KEY'), None)
AttributeError: 'NoneType' object has no attribute 'get'
127.0.0.1 - - [02/Mar/2019 02:56:46] "POST /auth HTTP/1.1" 500 -

Это похоже на возможную ошибку в Flask_JWT, но я не могу быть уверен на 100%…

Поскольку все это занимает у меня так много времени, я попросил их еще 4 дня поработать над этим. Если я буду усердно молоть, то смогу сделать это за 4 дня.

Дело в том, что в данный момент эта часть представляет собой блокпост…

Даже если бы мне пришлось вернуться/начать с нуля, перестроить все в минимальной колбе, когда я доберусь до этой части, мне все равно придется решить, как сгенерировать JWT…

Flask_JWT должен был решить эту проблему для меня, но даже использовать его немного сложно…

Я вбираю в себя много новой информации, и это требует некоторой умственной обработки с моей стороны.

Итак, подведем итог:

/getusers is reflecting our json post data now
/auth is crashing for Flask_JWT

Текущий день и время: Сб 2 марта 2019 03:03 Дата доставки: Сб 2 марта 2019 06:35 утра Текущее затраченное время: 1 час 50 минут 01 с Общее затраченное время: 7 часов 18 минут 05 с

Обновление статистики:

Текущий день и время: Ср 6 марта 2019 14:29 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее затраченное время: 0hr0m0s Общее затраченное время: 7hr18m05s

Нам было предоставлено продление.

Проверьте это:

Нам нужно перезапустить это с нуля, мы перестроили.

User Signup: POST /getusers
Refresh JWT: POST /some-token-endpoint/refresh
User login: POST /some-token-endpoint
Log out: DELETE /some-token-endpoint
Get current user's info: GET /myinfo
Create idea: POST /getideas
Delete idea: DELETE /getideas/:id
Get a page of ideas (1 page = 10 ideas): GET /getideas
Update idea: PUT /getideas/:id

Для каждого доступного метода:

  1. Регистрация пользователя
  2. Обновить JWT
  3. Логин пользователя
  4. Выход пользователя из системы
  5. Получить информацию о текущем пользователе
  6. Создайте идею
  7. Удалить идею
  8. Получите страницу идей
  9. Обновление идеи

Нам нужно будет заново создать базу данных.

class User:
  name
  email
  password_hash

class Idea:
  user_id 
  text
  usermode
  trial
  continental
  averaje

UserTable
IdeaTable

Первый коммит. Привет, мир.

Текущий день и время: Ср 6 марта 2019 14:49 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr8m12s Общее время: 7hr26m17s

Далее нам нужно будет снова создать базу данных и таблицы.

Сделано.

Текущий день и время: Ср 6 марта 2019 15:19 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее затраченное время: 0hr23m49s Общее затраченное время: 7hr50m06s

Далее, фактически реализуя каждую функциональность. Логически мы должны начать с регистрации пользователя .

Регистрация пользователя

  1. Проанализируйте входные данные
  2. Проверка входных данных
  3. Передать проверенные входные данные новому объекту пользователя
  4. зафиксировать пользователя в БД
  5. Постройте JWT и верните необходимые токены

Проверка входных данных.

Текущий день и время: Ср 6 марта 2019 23:05 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr28m0s Общее время: 8hr18m06s

Впервые я услышал о flask_jwt .

Затем я услышал о flask_jwt_extended .

Затем я услышал о flask_jwt_auth

Все эти учебники-сплошная боль!

О, ЧЕРТ, ЭТО ЧЕРТОВСКИ РАБОТАЕТ, МЫ ГЕНЕРИРУЕМ JWT!!!

Волшебный соус-это

retval = {
  'access_token' : create_access_token(identity=u.id),
  'refresh_token' : create_refresh_token(identity=u.id)
}

На самом деле мы возвращаем как JWT, так и refresh_token.

Мой главный вопрос по-прежнему заключается в том, как работает refresh_token в первую очередь, это не объясняется во введении JWT, но я все еще должен знать, что это такое и как это работает, когда я его отправляю…

Ах да, есть какой-то декоратор, например @refresh_token_required или что-то в этом роде.

Это взято из библиотеки flask_jwt_extended так что спасибо вам за то, что вы здесь мой спаситель.

У нас все еще есть все другие API для реализации, но регистрация пользователя официально ЗАВЕРШЕНА!

Для каждого доступного метода:

1. Регистрация пользователя завершена 2. Обновить JWT 3. Войти в систему пользователя 4. Выйти из системы пользователя 5. Получить информацию о текущем пользователе 6. Создать идею 7. Удалить идею 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Чт 7 марта 2019 года 23:30 Дата доставки: Пт 8 марта 2019 года 11:59 вечера Текущее затраченное время: 1ч 31м 02с Общее затраченное время: 9ч 49м08с

Примечание для себя:

Причина, по которой у нас было так много проблем с получением SECRET_KEY, заключалась в том, что мы настраивали наше приложение из определенного объекта, называемого Config. Чтобы решить эту проблему, нам пришлось переместить SECRET_KEY и JWT_SECRET_KEY в определение класса.

Давайте войдем в систему. Это должно быть легко.

Mar 8 1:57am: TIL Flask routes expect to return Responses or strings, tuples, etc, but not Dicts!

Похоже, вход в систему завершен.

Мы могли бы потратить несколько минут на очистку отладочных сообщений.

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Чт 8 марта 2019 02:13 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr55m11s Общее время: 10hr44m19s

Токен обновления:

POST /some-token-endpoint/refresh 
{'jwt': '', 'refresh_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTIwMzA5OTcsIm5iZiI6MTU1MjAzMDk5NywianRpIjoiYjBjOGNhNDMtZmQzYi00OWI5LWFjM2YtZmU4ZWU0YjljY2UyIiwiZXhwIjoxNTUyMDMxNTk3LCJpZGVudGl0eSI6MSwidHlwZSI6InJlZnJlc2gifQ.9Akh0uY4ou8DBarkp2lDqS38dlIebqnwk0ss3J5B05s'}
JWT="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTIwMzA5OTcsIm5iZiI6MTU1MjAzMDk5NywianRpIjoiMWQ5NmU4MGQtOWQyZi00Mjg2LWEyMzItNGYxNDY5NjI5MGYyIiwiZXhwIjoxNTUyMDMxODk3LCJpZGVudGl0eSI6MSwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.HyMCR5mFdcoUi7VUjA3LeiTDGn8Ccsy08Y9Bbc0LL9M"
REFRESH_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTIwMzA5OTcsIm5iZiI6MTU1MjAzMDk5NywianRpIjoiYjBjOGNhNDMtZmQzYi00OWI5LWFjM2YtZmU4ZWU0YjljY2UyIiwiZXhwIjoxNTUyMDMxNTk3LCJpZGVudGl0eSI6MSwidHlwZSI6InJlZnJlc2gifQ.9Akh0uY4ou8DBarkp2lDqS38dlIebqnwk0ss3J5B05s"
./curl_refresh.sh "$JWT" "$REFRESH_TOKEN"

Похоже, мы успешно возвращаем новые JWT!!!

Примечание для себя, чтобы спасти себя от будущих неприятностей:

JWT_HEADER_NAME 
JWT_HEADER_TYPE

Множество опций конфигурации в flask-jwt-extended

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Пт 9 марта 2019 02:51 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr35m23s Общее время: 11hr19m42s

Выход из системы

Похоже, мы это сделали.

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Пт 8 марта 2019 04:56 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr20m08s Общее время: 11hr39m50s

Получить информацию о текущем пользователе было очень просто. Мы все еще должны что-то сделать с этим URL-адресом граватара. Мы можем вернуться к этому.

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Пт 8 марта 2019 05:10 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr10m44s Общее время: 11hr50m34s

Создайте идею

Пока все хорошо…

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Пт 8 марта 2019 06:08 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr51m00s Общее время: 12hr41m34s

Удалить идею

  • Убедитесь, что идентификатор идеи действителен и существует
  • Удалите идею из БД

Дерьмо…

Как создать динамические маршруты с идентификаторами в колбе???

Хорошо выглядеть.

Я чертовски голоден.

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Пт 8 марта 2019 06:25 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr15m00s Общее время: 12hr56m34s

Мы взяли пару выходных, но

сначала войдите в систему, а затем передайте JWT в/get ideas

{'jwt': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTIyMzkzMDMsIm5iZiI6MTU1MjIzOTMwMywianRpIjoiYzc3NGIyZWUtZTVmZi00ZTUzLWI2ZjktYjAyNDkxZWI1ZDI4IiwiZXhwIjoxNTUyMjQwMjAzLCJpZGVudGl0eSI6MSwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.NJDvj57c_hxqoqt5N_0zPYFHqxJOOjhMdAaQ_jIIcR4', 'refresh_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTIyMzkzMDMsIm5iZiI6MTU1MjIzOTMwMywianRpIjoiNzc5ZDYzZTctZjM0Ni00MjQ1LWFlMTEtODkwMDM0OGQ3OWYyIiwiZXhwIjoxNTUyMjM5OTAzLCJpZGVudGl0eSI6MSwidHlwZSI6InJlZnJlc2gifQ.xX9a60sgVZ01OHjFwSPFF8EV-E_oS1YBfLiglGECYL4'}

Мы пытаемся вернуть наши идеи в виде json.

File "/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Idea is not JSON serializable

Итак, как мы можем сделать объект в Python JSON сериализуемым?

Один из обходных путей, который я получил, – это вызов .serialize (), как только он определен.

retval = jsonify([idea.serialize() for idea in idea_page.items])

Я думаю, что это завершает все!

1. Регистрация пользователя завершена 2. Вход пользователя ЗАВЕРШЕН 3. Обновление JWT 4. Выход пользователя из системы 5. Получение информации о текущем пользователе 6. Создание идеи 7. Удаление идеи 8. Получить страницу идей 9. Обновить идею

Текущий день и время: Вс 10 марта 2019 13:54 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr20m00s Общее время: 13hr16m34s

СДЕЛАНО!!!

Текущий день и время: Вс 10 марта 2019 14:53 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr17m30s Общее время: 13hr34m04s

Ладно, кажется, это все.

Мы опустили URL-адрес граватара.

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

  1. Создайте частный репозиторий Github или Bitbucket для окончательной отправки кода
  2. Добавьте нашу учетную запись Github или Bitbucket в свой репозиторий
  3. Разверните свой код в онлайн-версии
  4. Напишите нам по электронной почте со следующей информацией:
    • Тема электронной почты:
    • Небольшой Бэк-Энд Проект: xxxxx
    • Ваше имя
    • Ссылка на ваш репозиторий
    • Ссылка на сервер API, по которой мы можем получить доступ и протестировать
https://en.gravatar.com/site/implement/images/
  1. Вычислить хэш электронной почты
  2. URL://www.gravatar.com/avatar/HASH
https://en.gravatar.com/site/implement/hash/
echo md5( strtolower( trim( "MyEmailAddress@example.com " ) ) );

Давайте преобразуем это в Python.

python3

import hashlib
email = 'youremail@example.com'
a = hashlib.md5(email.lower().encode())
a.hexdigest()

Это то, чего мы хотим.

gravURL = 'https://www.gravatar.com/avatar/' + str(a.hexdigest())

Нам нужно, чтобы это произошло при регистрации пользователя.

Это в routes.py .

Для этого нам нужно обновить определение User в models.py файл.

Или, может быть, мы могли бы возвращать его каждый раз?

Может быть, нам удастся избежать обновления модели.

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

Я ожидал этого, имея поле в getCurrentUserInfo .

Проблема решена.

Время подачи заявки.

  1. Создание частного github

примечание: время зеленого чая

сделано

  1. Разверните наш код в онлайн-версии

Мы собираемся опробовать метод local tunnel , это кажется наименьшей проблемой. Мне не хочется сегодня изучать Хероку или что-то в этом роде.

Современный местный тоннель:

Команда lt теперь.

Дерьмо…только что понял, что мне придется установить много зависимостей -_-;...

sudo apt install python3-flask -y 
python3-flask-sqlalchemy
python3-flask-migrate
python3-flask-jwt-extended

sudo apt install python3-pip
pip install setuptools
pip install flask-jwt-extended

Хорошо, он работает на моем сервере.

Похоже, мы должны сделать это вместо этого:

Я очень устал. Мы сделаем это утром на совершенно новом сервере.

Текущий день и время: Ср 13 марта 2019 4:39 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 1 час 40 минут 41 сек Общее время: 15 часов 14 минут 04 сек

Вернемся к этому ночью, лол. фффф

Запуск сервера для размещения этой штуки.

Иду по маршруту apache mod_wsgi.

Перво-наперво обезопасьте сервер.

Сделано.

Затем установите зависимости.

sudo apt-get install python3-pip \
python3-flask \
python3-flask-sqlalchemy \
python3-flask-migrate -y

pip3 install setuptools
pip3 install flask-jwt-extended

Сделано.

Теперь все, что осталось, – это переместить код приложения в соответствующий каталог и начать настройку wsgi.

Текущий день и время: Ср 13 марта 2019 22:31 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 0hr20m00s Общее время: 15hr34m04s

Это слишком сложно… Я прошел через все шаги, но продолжаю сталкиваться с 500 ошибками, когда пытаюсь его обслужить. Я бросаю полотенце. Ждать… ЕГО ПОДАЮТ!!! МЫ СДЕЛАЛИ ЭТО!!!

НАКОНЕЦ-ТО ПРЕДСТАВИЛИ ВСЕ

ПОСЛЕДНИЙ ЖУРНАЛ ВРЕМЕНИ!!!

Текущий день и время: Чт 14 марта 2019 2:59 Дата доставки: Пт 8 марта 2019 11:59 вечера Текущее время: 1 час 02 минуты 00 минут Общее время: 16 часов 36 минут 04 минуты

В течение примерно 2-3 недель удалось выжать 16 часов дополнительного “времени”, которое было потрачено на изучение фреймворка “Колба” в реальной манере, похожей на crashcourse.

Однако.

Теперь я могу разрабатывать и развертывать веб-приложения через Flask и mod_wsgi с помощью входа в токен JWT.

Есть много работы по форматированию этого блога материалов, потому что он действительно хаотичен/рассеян, но я думаю, что многие люди найдут это полезным и интересным.

Все URL-адреса в этом блоге