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

Уроки извлечены построение каркаса с полным стеком для Django

Идея для Джанго-Юникорна все началась достаточно невинно с твита 8 июля 2020 года. После Джела … Tagged с Django, JavaScript, Python, Unicorn.

Идея для Django-Unicorn Все началось достаточно невинно с твита 8 июля 2020 года.

После ревностного наблюдения за демонстрациями Liveview Феникса , Я построил прототип Мониторинг мониторинга в реальном времени для Django с веб -окетами и Alpine.js Анкет После того, как прошлый боковой проект немного сошел (читай: не стал весело), используя Django, Vue.js и GraphQL, простота модели альпийской нанесла хорошую среднюю землю.

Затем я заметил автора Livewire проект. Несмотря на то, что это было для веб -структуры PHP Ларавел Это звучало интригующе И я сразу же был поражен сайтом документации. Мысль о упрощении веб-разработки, позволяя «код на стороне сервера», называемой «с переднего конца, была привлекательной. Вместо создания набора API, отображения моделей данных на их представление и переключение языков для создания приложения на одном страницах в JavaScript, Livewire Использует код бэкэнда и обеспечивает клей для взаимодействия фронта. Это удовлетворило потребность, которую я видел повсюду – это, безусловно, не идеально для каждого приложения, но, вероятно, полезно для 80% веб -сайтов.

После просмотра доступных экрана, я действительно хотел, по крайней мере, прототип проекта с ним. Но … не Достаточно, чтобы отключиться от моей типичной технической стопки Python и Django. Ларавел Выглядит красиво, но я довольно инвестирован в экосистему Python. Итак, я написал в Твиттере, жалуясь, что у Джанго не было подобной библиотеки, и мой друг, Мишель Затем ответил с волшебным вопросом: «Почему бы тебе не сделать это самостоятельно».

Я провел следующие 3 дня, пересмотрев Livewire Скрикалы довольно пристально, чтобы увидеть «форму» запросов JSON и ответов, обыскали сайт документации и прочитав код JavaScript Livewire, чтобы понять, как он работает. Мой первый толчок к GitHub был 11 июля – через три дня после этого первого твита.

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

За последние пять месяцев было много знаний. Я расскажу о нескольких, связанных с Python, JavaScript, а затем некоторыми общими мыслями, которые Django-Unicorn немного вырос (версия 0.11.0 была только что выпущена).

Python был моим предпочтительным языком программирования в течение последних 8 лет или около того, и Django был моей устойчивой веб-структурой. Вокруг может быть несколько более ярких веб-фреймворков, но для необработанной скорости я могу перейти от идеи к таблицам базы данных к HTML-серверу, я бы ничего не выбрал.

импорт

ImportLib.import_module является механизмом динамического импорта модулей Python. Django-Unicorn Использует эту функциональность, чтобы иметь возможность найти и загружать компонент на основе представления строки имени компонента, которое указано в шаблоне.

{% unicorn 'hello-world' %}

Привет, мир Имя компонента преобразуется в имя модуля hello_world.py и название класса HelloworldView Анкет Затем разные приложения Django искали, чтобы найти правильный модуль (по умолчанию Unicorn.components.hello_world.py ). Как только вся строка создана, import_module призван для извлечения правильного компонента.

осмотреть

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

Literal_Eval

Django-Unicorn Поддерживает методы вызова с фронта с объектами Python в качестве аргументов.

dictionary.name: {{ dictionary.name }}

Аргументы метода выглядят как Python, но на самом деле являются строками, потому что все взаимодействия находятся через JSON. Аргумент в set_dictionary ({"name": 1, "inted": {"name": 2}}) должен быть проанализирован. Первоначально я создал простой анализатор, чтобы преобразовать строки в объекты Python, но затем наткнулся на Literal_Eval который «может быть использован для безопасной оценки строк, содержащих значения питона из ненадежных источников без необходимости проанализировать значения самостоятельно. ” Это может состоять только из следующих литеральных структур питона: строк, байтов, чисел, кортежей, списков, дамп, наборов, логических и ни одного », но я в конечном итоге вручную обрабатываю DateTime и Uuid также. Гораздо безопаснее, чем звонить eval () И более вменяемый, чем пытаться обработать все случаи самостоятельно.

lru_cache

Стандартная библиотека предоставляет lru_cache декоратор, который экономит результаты от до maxsize функциональные вызовы. Однажды maxsize +1 уникальный аргумент функции называется, кэш вызывает первый объект, который был втянут в него. Cachetools обеспечивает аналогичную функциональность в качестве класса, чтобы его можно было использовать без декоратора функций.

Кэши LRU используются в Django-Unicorn Чтобы предотвратить повторное заключение и повторное конструирование классов компонентов и предотвратить повторную сетериализацию тех же данных из словаря Python в строковое представление. Оба процесса могут быть сравнительно медленными и имеют тенденцию происходить несколько раз с одинаковыми входами.

набор

Тип является относительно новой для экосистемы Python (представленная с PEP 484 ), но я считаю, что они являются полезным дополнением, особенно с mypy и редактор, который понимает типовые аннотации (лично я был очень доволен vs код и пиленок )

Дополнительные аннотации типа предназначены только для того, чтобы помочь разработчикам понять код (они не используются во время выполнения для оптимизации – по крайней мере, пока), но даже в этом случае они были полезны для «будущего меня», чтобы лучше понять контекст для моего код. Исходя из предыдущего статического языка, C#, я в определенной степени ценю типы, но я считаю, что этот средний способ является особенно полезным-у меня есть свобода прототипа без жесткой системы типа, но поскольку дизайн укрепляет I склонны добавлять в соответствующие типы, где они могут быть полезны.

Другие полезные сторонние пакеты Python

  • Orjson : выбрано, потому что 1) он, по-видимому, является одним из самых быстрых сериалов JSON для Python, и 2) он обеспечивает поддержку библиотеки для сериализации больше данных, чем вне коробки json Библиотека (плюс, он обеспечивает крючок, чтобы «сбрасывать» другие типы по мере необходимости)
  • короткий : используется для создания уникального идентификатора для компонентов. Потенциал возможного столкновения приемлем из -за ограниченного потенциального числа компонентов
  • Прирление : Декораторы легко создать, но обманчиво трудно сделать правильным и Прирление обрабатывает все твердые части
  • BeautifulSoup4 : Dealhely parse html, не вырывая волосы

В первую очередь я был разработчиком бэкэнда большей части своей карьеры, и, помимо нескольких побочных проектов, написанных в первые годы Node.js, я не работал в JavaScript, помимо добавления небольших функций здесь или там. Тем не менее, как пишет Майкл Абрахамсен в своем Сообщение о Flask-Meld , «… вот я, пишу много JavaScript, чтобы я мог писать меньше JavaScript. В конце концов, я инженер. ” Это забавная мысль, и я бы не сказал, что я особенно великий разработчик JavaScript, но за последние 5 месяцев я узнал тонну о DOM и более «современной» экосистеме JavaScript.

ES6

Мне не стыдно говорить это: долгое время я не «получал» причины, чтобы использовать что -то, кроме JavaScript ES5 в браузере. Я не понимал, зачем мне нужны занятия, когда я мог выполнять ограниченные взаимодействия DOM, которые мне нужны с прототипом наследием и функциями. Я также настаивал на том, что, как я предполагал, было требованием использовать транспилера, такого как Вавилон за то, что казалось таким минимальным преимуществом.

На самом деле, когда я впервые начал Django-Unicorn Все было написано в ES5 с большим количеством громоздких функций повсюду. Со временем стало очень трудно следить за потоком кода между всеми функциями, и я не организую код в понятные части. Может быть, это просто «объектно -ориентированное» мышление, которое было пробурено в течение многих лет, но я нашел JavaScript модули и возможность использовать класс быть чрезвычайно полезным для организации кода.

Вавилон и ролп

Поскольку современная поддержка браузера почти универсалена для функций ES6, которые я использую (95%+), я могу разработать с использованием es6 JavaScript и только транспилировать в ES5 при создании минимизированной версии, которую я отправляю в библиотеку. Первоначально я только что сражался с Вавилон , но после этого быстро я искал что -то простое для настройки, которое также могло бы минимизировать отдельные файлы JavaScript в один файл.

Посмотрев на Livewire код снова, я понял, что они используют RULLUP что выглядело так, как будто он соответствовал бы счету. Было немало ограбления и чтения о Iife Чтобы понять, что я хотел сделать, но теперь процесс сборки быстрый и безболезненный.

Esbuild (потенциально)

Я также исследовал Esbuild Из -за обещания еще быстрее построения. Есть Esbuild pr Кажется, это работает, как и ожидалось. Это даже создает немного меньший размер файла, чем свернуть . Однако, похоже, нет способа интеграции Вавилон в процесс, и я не совсем готов отказаться от ES5 для пользователей в действительно старых браузерах. В какой-то момент этот компромисс, вероятно, переместится, я ожидаю, хотя.

Ава и Jsdom

Мне нужна была проведенная платформа для тестирования JavaScript, которая была быстрой и низкой церемонией (я думаю, что вижу повторяющуюся шаблон) и ava казался лучшим вариантом. ava До сих пор отлично работал и хорошо подходит для моего подхода.

Одна из проблем с тестированием JavaScript абстрагирует DOM, поэтому вам не нужны функциональные тесты, такие как Селен (Хотя я провел некоторое время с web-test-Runner драматург И они были впечатляюще быстро вращаться). Однако JSDOM Позволяет моим тестам иметь достаточно DOM для тестирования взаимодействий, таких как Click Events, не требуя реального веб -браузера. Мне пришлось добавить крючки, чтобы определенные части моего JavaScript могли использовать JSDOM DOM вместо DOM браузера, но после этого было добавлено, он, кажется, работает хорошо.

Морфдод

Часть магии Django-Unicorn Как обновляется DOM. Это работает только достаточно хорошо из -за работы Морфдод . Супер впечатляющая библиотека, а также основная часть Livewire , также.

Создание библиотеки с открытым исходным кодом-это не все о коде (насколько я действительно хотел бы). Я узнал несколько вещей, которые были связаны не с Python или JavaScript, а обо всем процессе.

Начните с малого

Django-Unicorn Начался как зародыш идеи, «Livewire для Джанго», но это было сложной задачей. Тем не менее, я знал, что я считал основной функциональностью, которую должна иметь библиотека и могла «увидеть» способ сделать это с самого начала:

  • Пользовательский тег шаблона Django, который находит класс компонентов и создает его
  • разоблачить все общественные поля в классе компонентов в контексте шаблона Django
  • Метод представления Django, который принимает объект JSON с определенным API
  • JavaScript, который слушает события, преобразует их в объект JSON и вызывает конечную точку зрения Django View
  • Кусочки Django, чтобы обернуть все вместе в приложение, которое можно было бы установить

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

Разбить большой проект на более мелкие, достижимые кусочки – лучший (или, может быть, только?) Я знаю, чтобы создать сложное, сложное программное обеспечение.

Все нужно маркетинг

Столько, сколько открытый источник хвалится как идеализированная меритократия, это действительно не так. Создание чего -то крутого и просто ждать, когда люди найдут это упражнение в разочаровании. Я думаю Калеб Порцио отлично справляется с этим с Livewire Анкет Между «работой публичной» в Твиттере, разговорами о конференциях, интервью и подкастах, очевидно, что он понимает, насколько важен маркетинг для его многочисленных проектов.

Все Livewire Веб -сайт также маркетинг. Первая страница – это в основном целевая страница, «продавая» библиотеку, и почему вы должны ее использовать. Документация API ясная и краткая, а Переворот де Грэс это скринкаст . Понятно, что он понимает, что разные люди учатся по -разному: некоторые хотят подробную документацию, некоторые хотят учебные пособия, некоторые хотят изобразить Как Библиотека работает. Экранбасты также тонко возражают от некоторых из разработчиков отказаться от этого подхода. Это все блестящий маркетинг.

Я знал за Django-Unicorn Чтобы быть даже умеренно успешным, ему потребуется больше, чем GitHub Readme с GIF. Довольно рано я создал отдельный Сайт документации с начальной целевой страницей и комплексной документацией с примером кода. Также важно иметь реальные компоненты, с которыми разработчики могут взаимодействовать и видеть, насколько хорошо они работают. Я определенно не дизайнер и хотел бы помочь сделать сайт документации лучше, но наличие автономного сайта кажется ключевым для поощрения большего количества пользователей, чтобы попробовать Django-Unicorn Анкет

Просто появляется

Для лучшего или худшего кода письма – моя дневная работа и мое хобби. Django-Unicorn С течением времени постепенно становится лучше из -за времени, которое я трачу на это. Несколько недель это может быть очень ограниченным, но среднее значение, вероятно, 10 часов в неделю. Каждую неделю я медленно добавляю новые функции, улучшаю модульные тесты, настраивайте копию сайта, отвечаю на проблемы GitHub и улучшаю документацию. Это работает только потому, что мне нравятся все части процесса. Как и большинство хобби, появление и медленно улучшение проекта – это как построить что -то великое.

Это также помогает иметь друзей, которые подталкивают вас, чтобы создать исправить Для проблемы вместо того, чтобы просто бездумно жаловаться на это в Твиттере!

Спасибо, что прочитали это далеко, и я надеюсь, что некоторые из моих уроков были полезны в вашем путешествии! Если вы заинтересованы в каркасе с полным стеком для Django, пожалуйста, ознакомьтесь с https://www.django-unicorn.com и рассмотрим Спонсирование меня на GitHub Анкет 🦄

Покрытие изображения с фото от Де’анре Буш

Оригинал: “https://dev.to/adamghill/lessons-learned-building-a-fullstack-framework-for-django-2cml”