Cайт на Django-nonrel на платформе Google App Engine для Python

    В этой статье я хочу немного рассказать о разработке своего проекта — сайта egaxegax.appspot.com.

    Поскольку являюсь большим поклонником языка Python, свой сайт я решил создать на популярном фреймворке Django. Чтобы использовать его на бесплатном хостинге appspot.com, адаптировал код для использования NoSQL версии django и платформы Google App Engine.


    Сайт существует с 12-го года. Я использую его как платформу для изучения возможностей django и appengine «вживую». Также интересно изучать статистику по нему в Google Webmasters: поисковые индексы, запросы. Например, для себя я выяснил, что Google индексирует для поиска заголовки title, а не содержимое тегов meta.

    Началось все с раздела Статьи — небольших заметок на программные темы: скрипты, конфиги, примеры использования. Но статьи быстро закончились. А создавать новые в большом объеме не получается. Нужно было что-то большее.

    Как-то где-то в Сети я скачал архив файлов с текстами и аккордами песен. Добавил к ним пару десятков своих подборов и решил выложить все на сайт. Всего получилось около 25000 файлов. Вручную столько не загрузить. Для этого я написал скрипт song_conv.bat, который преобразует текстовые файлы в дампы для загрузки данных таблиц в GAE DataStore.

    Загрузку данных пришлось разделить на несколько этапов из-за ограничений на количество операций записи в сутки в DataStore. В сутки получалось записывать около 700-800 записей (файлов).

    Таким способом я загружал первую порцию текстов объектом около 11000 файлов (записей в DataStore). После этого я написал скрипт song_upload.py для загрузки данных через РОST-запрос по HTTP-протоколу. Таким образом я имитирую заполнение полей формы ввода и обработка идет через тот же контроллер. Скорость загрузки данных уменьшилась, но зато я могу отладить локально вставку данных.

    После загрузки данных через некоторое время при открытии страницы сайта все чаще стала возникать ошибка 503 Server Error: Over Quota. Поизучав логи на сервере, я выяснил, что главными пользователями моего сайта были googlebot и yandexbot, которые обращаются к страницам с интервалом в 2-3 минуты. Ошибка возникает из-за превышения ограничения количества операций в сутки на чтение из DataStore.

    Посмотрев документацию и примеры по appengine, я понял, что совсем не использовал модуль cache (а именно memcache). Каждое открытие страницы вызывало обращение к базе данных через QuerySet. В новой схеме результаты выборок из рекордсетов QuerySet я передаю в списки Dictionary, которые сохраняются в кэш и считываются оттуда при повторном обращении. Это решило проблему с быстрым исчерпанием лимита на чтение.

    Позже я добавил раздел Фото и Новости. Разделы оформлены как отдельные приложения (apps). Данные хранятся в таблицах DataStore. Раздел Фото также использует хранилище файлов BlobStore. Все приложения используют кэш при выборке данных.

    По аналогии с разделом Аккорды я заполняю раздел Книги, куда выкладываю тексты электронных книг. Тексты книг я получаю, распаковывая файлы *.epub с помощью скрипта book_conv_up.py из каталога /media/scripts. В отличие от текстов песен они намного больше в объеме и не могут быть целиком отображены на странице. Кроме того, возникла проблема с тем, что книга целиком не может быть добавлена в кэш из-за превышения лимита памяти кэша. Для этого я считываю, помещаю в кэш и отображаю их по главам.

    Для заполнения разделов Фото и Книги я написал скрипты photo_upload.py и book_upload.py как и для заполнения текстов песен.

    На сайте есть встроенная в Django авторизация пользователей и добавление новых с проверкой через Captcha.

    Кому интересно заходите на страницу проекта в репозитории GitHub django-egaxegax.
    • –5
    • 8.3k
    • 6
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 6

      0
      Почему просто не использовать webapp2 и ndb?
        +1
        А зачем вы все зависимости копируете себе в проект? Это какое то ограничение бесплатного appspot?

        Еще у вас много повторяющегося кода. Например, def ZI(s): и def PageList(request, qst, per_page=5): во views каждого из приложений, плюс один и тот же templatetags в каждом приложении.
          0
          Да правильно заметили — в проекте все далеко не оптимально настроено. Просто первоначально я скопировал некоторые зависимости в проект, так они там и остались. Да и дублирование функций присутствует. При создании новых приложений (разделов) за основу я брал уже имеющееся guestbook. И часть кода осталась, например templatetags, и скорее всего не используется. В общем берем на заметку.
          +2
          NoSQL версии django

          Первый раз о такой версии слышу)
            –2
            Не слышу, а читаю. Я ничего не говорил. Только написал. Наверное, правильнее было бы написать NoSQL + Django или Django-nonrel.
            0
            в принципе, на вступлении можно было и закончить, статья ни о чем вообще.

            Only users with full accounts can post comments. Log in, please.