#django
#django
Вопрос:
В настоящее время я работаю над веб-сайтом django. У меня было два запроса об ускорении моего веб-сайта.
- У меня есть страница продуктов, на которой я показываю продукты. В настоящее время, когда я тестировал его с 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: да, поскольку, опять же, чем больше данных вы передаете между базой данных и веб-сервером, тем больше времени это занимает. Также потребуется больше циклов процессора для чтения записей и выполнения обработки в представлениях и шаблонах.