Общие рекомендации по размещению логики в JavaScript и основной структуре

Я знаю, что этот вопрос может быть закрыт, но у меня действительно возникают проблемы с определением того, какие части функции поиска должны быть реализованы в jQuery, AJAX-запросах или базовом дизайне фреймворка.

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

Выполнение поисковых запросов: в основном, все, что я здесь делаю, это собираю значения в несколько форм, затем помещаю объект JSON в API REST, получая результаты обратно в виде JSON.

Фильтры / сортировка: я мог бы выполнить фильтрацию, либо сделав новый вызов AJAX для того же API REST в немного другой конечной точке, либо отфильтровав старый список результатов на основе данных в объекте JSON. Для сортировки у меня в настоящее время есть модуль python, который сортирует данные различными способами, но для этого требуется новый запрос get для каждой отдельной сортировки, а логика достаточно проста, чтобы было легко перейти на Javascript

Разбиение на страницы: здесь достаточно стандартно с одним изменением, которое заключается в том, что я мог бы потенциально реализовать разбиение на страницы, выполнив другой вызов AJAX, так как используемый мной REST API позволяет определить точную границу ответов, которые я хочу вернуть, хотя, если я хочу используйте нестандартную сортировку, это не сработает. Прямо сейчас я использую пагинацию Django, которая работает, но я чувствую, что в приложении было бы намного легче, если бы я использовал решение jQuery для нумерации страниц.

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

1 ответ

На джанго медлительность

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

Вы имеете в виду, что вы выполняете поиск через ORM Джанго? Если это так, есть две причины, почему это может быть медленным.

  1. Вы запрашиваете поля, которые не проиндексированы.
  2. Вы пытаетесь выполнить полнотекстовый поиск (или использовать __icontains), который работает медленно в любой базе данных.

ORM Джанго - это шумиха вокруг базы данных. Он имеет то же ограничение производительности и гибкости, что и база данных, которую вы используете, только с более приятным API. Если вам нужна производительность и гибкость поиска, используйте хранилище данных, оптимизированное для поиска, что приводит меня к...

Выполнение поисковых запросов

Вы смотрели в стоге сена? Он предлагает API-интерфейс, специально разработанный для выполнения поиска по вашим данным, и интегрируется с бэкэндами, оптимизированными для скорости и гибкости поиска (мой фаворит --asticsearch).

Если вы не хотите добавлять дополнительные технологии в свой стек и используете postgres, почему бы не заглянуть в индексы GIN и GIST для полнотекстового поиска. Вам нужно будет использовать некоторые расширения для управления им, и вам придется научиться профилировать свои запросы, чтобы добавлять дополнительные индексы там, где они вам нужны.

Фильтры / Сортировка

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

пагинация

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

Заметки

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

Другие вопросы по тегам