@DmSS1997

Как я могу оптимизировать скорость загрузки страницы на сайте?

У меня на сайте есть раздел с офисами, на котором помимо информации об объектах, есть ещё и фильтрация.
Код из models.py: (Код не полный, но это не важно, там в районе 10 атрибутов)
class Offices2(models.Model):
    city = models.CharField(max_length=255, choices=Choice_city, blank=True, verbose_name='Город')
    address = models.CharField(max_length=255, blank=True, verbose_name='Адрес')

Мне нужно было добавить на страницу с офисами карту, на которой будут расположены объекты, для чего я использовал Folium и GeoCoder. До добавления карты, страница загружалась очень быстро, даже учитывая, что там была фильтрация и учитывая огромное кол-во объектов в БД.

Вот такой код во views.py был до добавления карты:
class OfficesPage(ListView):
    model = Offices2
    template_name = 'CatalogTenants/offices.html'
    context_object_name = 'offices'
    paginate_by = 10
    allow_empty = True

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['FilterOffice'] = OfficesFilter(self.request.GET, queryset=Offices2.objects.all())
        context['form'] = ClientsForm()

   def post(self, request):
        if request.method == 'POST':
            form = ClientsForm(request.POST)
            if form.is_valid():
                form.save()
                send_mail(subject=form.cleaned_data['FIO'],
                          message=form.cleaned_data['phone'],
                          from_email='pdlyadirekt@yandex.ru',
                          recipient_list=['solonkou4eba@mail.ru']
                          )
                messages.success(request, 'Заявка отправлена')
                return redirect('offices')
            else:
                messages.error(request, 'Форма заполнена неверно')
                form = ClientsForm()
                return redirect('offices')

    def get_queryset(self):
        queryset = super().get_queryset()
        return OfficesFilter(self.request.GET, queryset=queryset).qs


Вот код из views.py после добавления карты.
class OfficesPage(ListView):
    model = Offices2
    template_name = 'CatalogTenants/offices.html'
    context_object_name = 'offices'
    paginate_by = 10
    allow_empty = True

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['FilterOffice'] = OfficesFilter(self.request.GET, queryset=Offices2.objects.all())
        context['form'] = ClientsForm()
        # Создание карты и изначального её расположения карты #
        m = folium.Map(location=[55.7887400, 49.1221400], zoom_start=7)
        # Получение коордиант из поля "адресс" у модели #
        for office in OfficesFilter(self.request.GET, queryset=Offices2.objects.values('address')).qs:
            location = geocoder.osm(office.get('address'))
            lat = location.lat
            lng = location.lng
            country = location.country
            ##Добавление объекта на карту##
            folium.Marker(location=[lat, lng], tooltip='Нажмите чтобы узнать больше', popup=country).add_to(m)
        m = m._repr_html_()
        context['m'] = m
        return context


И тут появляется проблема, что чем больше объектов в БД, тем дольше грузится страница и я не понимаю с чем это связано, а самое главное, я не понимаю, как это можно исправить. Я пробовал создавать метки без обращения к БД, а просто выставляя маркеры во view и тогда скорость загрузки страницы не менялась (была изначальной, то есть минимальной), то есть отсюда я делаю вывод, что время загрузки увеличивается из-за обращения к БД.

Изначально был вот такой код:
# Создание карты и изначального её расположения карты #
        m = folium.Map(location=[55.7887400, 49.1221400], zoom_start=7)
        # Получение коордиант из поля "адресс" у модели #
        for office in OfficesFilter(self.request.GET, queryset=Offices2.objects.all().qs:
            location = geocoder.osm(office.get('address'))
            lat = location.lat
            lng = location.lng
            country = location.country
            ##Добавление объекта на карту##
            folium.Marker(location=[lat, lng], tooltip='Нажмите чтобы узнать больше', popup=country).add_to(m)
        m = m._repr_html_()
        context['m'] = m
        return context

Я подумал, что получаю слишком много не нужной информации и решил получать только информацию об адресах, и переписал код. Его вы можете увидеть в начале. Но это не повлияло на скорость загрузки.
61c8856b652eb512365423.png
61c88581de0d5209416053.png
61c885bc5bde0713996672.png

В чём причина и как это исправить, помогите пожалуйста
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы