bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Интеграция БЭМ и бэкенда на django #895

Open v-bornov opened 8 years ago

v-bornov commented 8 years ago

Планирую написать сайт на БЭМ и django. Взаимодействие будет реализовано как написал Владимир тут https://ru.bem.info/forum/483/#comment-120414533

  1. Наружу торчит какой-нибудь балансер (например, nginx).
  2. За ним стоит node.js сервер, который ходит в джангу за данными (rowData). Это может быть как один запрос так и агрегация нескольких запросов по http или через unix-socket. Помимо Django нода может собирать данные из любых других необходимых источников (сторонних API, etc). Соответственно Django ничего не знает про view-часть и служит универсальным источником данных для десктопа, телефонной веб-версии или мобильного приложения.
  3. Полученный от Django ответ rowData отдается первому слою преобразования (например, с помощью BEMTREE и на выходе получается BEMJSON — т.е. это по-прежнему данные, но уже знающие про view.
  4. Далее BEMJSON передается в BEMHTML/BH и на выходе получается HTML.

Но я не хочу переносить какую-либо бизнес логику в nodejs. Nodejs будет лишь принимать запросы и проксировать их в django. Django будет возвращать данные только в JSON. При этом помимо самих данных бэкенд будет предоставлять дополнительные данные для БЭМ стека. Например, имя бандла, который должен принять эти данные и сформировать HTML.

Таким образом, можно будет воспользоваться всеми преимущесвами построения интерфейса на БЭМ, но при этом оставить всю бизнес-логику в django, не дублировать логику (DRY)

На стороне django будут реализованы все необходимые урлы, вьюхи. Вьюхи полагаю будут в основном на django-rest-framework + доп. данные для БЭМ. А вот на стороне nodejs будет простейший proxy сервер на express. Proxy сервер будет принимать запросы от браузера, проксировать их в django и получать в ответ JSON-данные. В этих данных будут дополнительные поля для БЭМ (возможно лучше передавать эти данные в заголовках ответа), например, имя бандла. А далее эти данные передаем в BEMTREE шаблон нужного бандла, получаем bemjson, далее этот bemjson передаем в BEMHTML шаблон и на выходе получаем html-код страницы, которуый передаем в браузер.

Это все в теории, хотелось бы услышать комментарии по данной реализации. Какие подводные камни могут ожидать?

Еще хотелось бы помощи в реализации proxy-сервера на nodejs. Пробовал использовать https://www.npmjs.com/package/http-proxy но так и не понял как его доработать, чтоб возвращать в браузер не json-ответ от django, а подменять его сформированным в БЭМ html. Может у кого есть примеры подобных реализаций? Поделитесь опытом.

tadatuta commented 8 years ago

Вполне годный подход.

На стороне сервера для превращения данных в HTML потребуется что-то вроде: https://github.com/tadatuta/bem-express/blob/master/server/render.js

qfox commented 8 years ago

По сути, вы просто отрываете рендер джанги и превращаете его в data-provider (что-то вроде API или REST), который возвращает данные для фронтенда (nodejs сервера между nginx и джангой).

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

upd: А фронтенд делаете на nodejs с использованием BEMTREE, BEMHTML и всего такого. Там же сами реализуете нужные ручки.

Если использовать REST, то можно что-то такое: http://www.django-rest-framework.org/ и https://github.com/search?l=JavaScript&q=rest+client

JiLiZART commented 8 years ago

Хочу сделать тоже самое, но data provider'ом будет php, сервер примерный накатал (да там и писать особо нечего). Простая мидлвара, которая смотри что пришло, делает запрос на endpoint, получает результат кормит его BEMTREE и выдает пользователю.

qfox commented 8 years ago

Нууу, я бы взял Laravel с каким-то REST модулем и тот же nodejs rest (restler или аналог) пакет ;) не уверен, что это лучшее решение, но ничего лучше в голову пока не приходит).