Общие рекомендации по размещению логики в JavaScript и основной структуре
Я знаю, что этот вопрос может быть закрыт, но у меня действительно возникают проблемы с определением того, какие части функции поиска должны быть реализованы в jQuery, AJAX-запросах или базовом дизайне фреймворка.
В общем, три задачи, которые я рассматриваю, - это выполнение новых поисковых запросов, применение фильтров / сортировки и разбиение на страницы. В настоящее время все эти функции обрабатываются Django (это среда, которую я использую), но я обнаружил, что этот подход медленный и негибкий. Я понимаю, что есть какая-то часть этого, и я действительно должен переместить сторону сайта на javascript, но мне трудно решить, где провести различие, и мне интересно, есть ли набор веб-стандартов, которые бы мне помогли.
Выполнение поисковых запросов: в основном, все, что я здесь делаю, это собираю значения в несколько форм, затем помещаю объект JSON в API REST, получая результаты обратно в виде JSON.
Фильтры / сортировка: я мог бы выполнить фильтрацию, либо сделав новый вызов AJAX для того же API REST в немного другой конечной точке, либо отфильтровав старый список результатов на основе данных в объекте JSON. Для сортировки у меня в настоящее время есть модуль python, который сортирует данные различными способами, но для этого требуется новый запрос get для каждой отдельной сортировки, а логика достаточно проста, чтобы было легко перейти на Javascript
Разбиение на страницы: здесь достаточно стандартно с одним изменением, которое заключается в том, что я мог бы потенциально реализовать разбиение на страницы, выполнив другой вызов AJAX, так как используемый мной REST API позволяет определить точную границу ответов, которые я хочу вернуть, хотя, если я хочу используйте нестандартную сортировку, это не сработает. Прямо сейчас я использую пагинацию Django, которая работает, но я чувствую, что в приложении было бы намного легче, если бы я использовал решение jQuery для нумерации страниц.
Я понимаю, что ответы будут частично основаны на мнении, но я действительно ищу конкретные причины, по которым я должен выбрать некоторые из этих вариантов, а не другие, такие как проблемы безопасности, производительность или значительное отклонение от веб-стандартов.
1 ответ
На джанго медлительность
В настоящее время все эти функции обрабатываются Django (это среда, которую я использую), но я обнаружил, что этот подход медленный и негибкий.
Вы имеете в виду, что вы выполняете поиск через ORM Джанго? Если это так, есть две причины, почему это может быть медленным.
- Вы запрашиваете поля, которые не проиндексированы.
- Вы пытаетесь выполнить полнотекстовый поиск (или использовать __icontains), который работает медленно в любой базе данных.
ORM Джанго - это шумиха вокруг базы данных. Он имеет то же ограничение производительности и гибкости, что и база данных, которую вы используете, только с более приятным API. Если вам нужна производительность и гибкость поиска, используйте хранилище данных, оптимизированное для поиска, что приводит меня к...
Выполнение поисковых запросов
Вы смотрели в стоге сена? Он предлагает API-интерфейс, специально разработанный для выполнения поиска по вашим данным, и интегрируется с бэкэндами, оптимизированными для скорости и гибкости поиска (мой фаворит --asticsearch).
Если вы не хотите добавлять дополнительные технологии в свой стек и используете postgres, почему бы не заглянуть в индексы GIN и GIST для полнотекстового поиска. Вам нужно будет использовать некоторые расширения для управления им, и вам придется научиться профилировать свои запросы, чтобы добавлять дополнительные индексы там, где они вам нужны.
Фильтры / Сортировка
Всегда делайте это на сервере. Если вы не хотите загружать результаты запросов всей базы данных в браузер, чтобы отфильтровать / отсортировать, вы должны делать это на сервере, где вы можете с умом отказаться от ненужных данных на ранних этапах.
пагинация
Может быть, немного не хватает встроенной системы пагинации в Django, но Haystack предоставляет свою собственную нумерацию страниц, и всегда есть простой в использовании и зрелый django-paginator.
Заметки
JQuery - это действительно хороший способ сделать вашу страницу поиска более заметной, но перемещение всего в браузер не будет решением вашей проблемы. Используйте инструменты, имеющиеся в вашем распоряжении на стороне сервера, чтобы сделать ваш API более быстрым и гибким, а затем используйте эту дополнительную гибкость, чтобы сделать клиентскую часть еще лучше.