Каковы наилучшие способы ускорить ваш веб-сайт, чтобы он загружался быстрее и потреблял меньше данных в django

#django

#django

Вопрос:

В настоящее время я работаю над веб-сайтом django. У меня было два запроса об ускорении моего веб-сайта.

  1. У меня есть страница продуктов, на которой я показываю продукты. В настоящее время, когда я тестировал его с 15 фотографиями, каждая размером около 8-10 мб, загрузка страницы заняла слишком много времени. Каким должен быть соответствующий размер изображения, чтобы оно соответствовало вышеуказанным условиям, а также качество изображения не становилось очень плохим.

2) У меня есть страница, на которой отображаются все товары всех категорий, и ее вид выглядит следующим образом

 qs = Product.objects.select_related('category').order_by(*sorting)
    types = [
        (k, list(vs))
        for k, vs in groupby(qs, attrgetter('category'))
    ]
  

Я хотел знать, помогут ли разные страницы для разных категорий быстрее загружать сайт за счет фильтрации таких продуктов, как p=Product.objects.filter() . Или фильтрация заняла бы столько же времени, сколько отображение всех продуктов на одной странице?

Комментарии:

1. Нет, фильтрация займет меньше времени. Поскольку » пропускная способность » будет меньше. Количество записей, возвращаемых базой данных на уровень Python / Django, будет меньше.

Ответ №1:

1.1) Чтобы уменьшить размер изображения, я настоятельно рекомендую вам использовать django-imagekit , который является идеальным инструментом для изменения размера изображений в Django

1.2) Убедитесь, что ваши изображения загружены с соответствующими заголовками кэширования ( expires и CacheControl )

2.1) Для вашего запроса вы можете выполнить запрос из Category модели, чтобы избежать ручной группировки результатов:

 # this retrieve categories and associated products
categories = Category.objects.all().prefetch_related('product_set')
  

И в вашем шаблоне :

 {% for category in categories %}
    {{ category.name }}
    {% for product in category.product_set.all %}
        {{ product.name }}
    {% endfor %}
{% endfor %}
  

2.2) Вы можете использовать cache_page декоратор для сохранения вашей страницы в кэше :

 from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
  

2.3) Не загружайте все свои продукты (если их много) сразу. Используйте стратегию разбивки на страницы или стратегию бесконечной прокрутки (с ajax)

Комментарии:

1. Что касается второй части, является ли создание разных страниц, например site.com/prods/category1 , и фильтрация товаров на основе параметра category, переданного в URL, каким-либо образом более эффективным, чем отображение всех товаров всех категорий на одной странице? И да, спасибо, что предложили разбивку на страницы. Я буду следить за этим.

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

Ответ №2:

Я хотел знать, помогут ли разные страницы для разных категорий быстрее загружать сайт за счет фильтрации таких продуктов, как p=Product.objects.filter() . Или фильтрация заняла бы столько же времени, сколько отображение всех продуктов на одной странице?

Фильтрация, как правило, будет быстрее, и, безусловно, в поле с индексом, а ForeignKey имеет индекс.

Таким образом, если вы теперь задаете идентификатор Category , вы можете просто фильтровать с помощью:

 Product.objects.filter(category_id=id_of_category)  

Это приведет к фильтрации на стороне базы данных, что, таким образом, приведет к меньшему количеству записей, возвращаемых на уровень Django / Python, меньшей обработке и меньшему рендерингу.

Комментарии:

1. Что касается второй части, является ли создание разных страниц, например site.com/prods/category1 , и фильтрация товаров на основе параметра category, переданного в URL, каким-либо образом более эффективным, чем отображение всех товаров всех категорий на одной странице?

2. @rohitbumrah: да, поскольку, опять же, чем больше данных вы передаете между базой данных и веб-сервером, тем больше времени это занимает. Также потребуется больше циклов процессора для чтения записей и выполнения обработки в представлениях и шаблонах.