Главная » PHP » Блог » Изучаем PHP-фреймворки на практике - часть 8, "На сладкое - из истории одного проекта на Django"

Изучаем PHP-фреймворки на практике - часть 8, "На сладкое - из истории одного проекта на Django"

Автор: grunged | Дата: 09 фев 2013
Изучаем PHP-фреймворки на практике - часть 8,
Здравствуйте, уважаемые читатели QwertyBox.ru. Как Вы, вероятно, заметили, с php-фреймворком Symfony мы поставили точку. Однако мы обещали - "на сладкое" - пару примеров веб-приложений на двух крайне популярных сегодня фреймворках Django и Ruby On Rails. Первый сделан на языке Python. Второй - на языке Ruby. Сегодня у нас Django...

Итак, ни строчки кода сегодня мы с Вами не напишем. Но зато немного заглянем "под капот" реального и достаточно крупного веб-проекта, целиком написанного на Python. И, по больше части, на базе веб-фреймворка Django. Что такое Django, предлагаем прочитать в Википедии. А заодно и о языке Python.

Скажем лишь, что как Django, так и в целом Python занимают серьёзную долю современного веб-программирования. К примеру, Python достаточно сильно поддерживает сам Google. Особенно, на фирменной платформе Google App Engine. Созданной для размещения на инфраструктуре интернет-гиганта наших с Вами интернет-проектов. За подробной информацией о App Engine также предлагаем обратиться к Википедии. А мы же начинаем наше повествование.

Давным-давно, в далёкой-далёкой... эээ... в общем, однажды я отправил письмо своему давнему знакомому, с которым у нас был небольшой интернет-проект года четыре назад. Долго мы с ним после этого не виделись. И тут он говорит, что ему отдают крупный интернет-портал Vegopolis.ru. Который был какое-то время достаточно популярным среди вегетарианцев рунета. Там люди публиковали новости, различные интересные друг для друга материалы. А ещё там была соцсеть для знакомств - "исключительно для вегетарианцев".

Но по каким-то причинам Вегополис заглох. И не обновлялся уже с полгода, когда я зашёл его посмотреть после разговора с Олегом Озеровым - так зовут моего товарища. Олег достаточно известный переводчик веганской литературы и активист в российской веганской тусовке.

В общем, старые владельцы отдали проект Олегу, чтобы он его использовал во благо всех живых существ и так далее. Я же договорился с Олегом поддержать проект технически. И самое первоочередное дело было такое - забрать Вегополис с зарубежного хостинга webfaction.com.

Мы решили перетащить его для начала на мой виртуальный выделенный сервер. А дальше - решить, что с ним делать. Развивать в том виде, в котором он приехал. Либо - "выкрасить и выбросить". Скажу сразу, что в тот момент у меня не было опыта с фреймворком Django и вообще языком Python. Но был интерес к этим конкурентным с php технологиям.

Поэтому первым делом я благополучно "грохнул" сайт:) Вот тут-то у меня мозг и включился на полную мощность! И за какие-то 30-40 минут с максимальной скоростью пришлось освоить всё самое важное и найти "самодельную" ошибку:))) Почти, как в Матрице - "Загрузите мне, пожалуйста, прямо в мозг учебник по Джанго и Питону":)

Так вот. Ещё толком не понимая как функционирует данный сайт, я подключился к хостингу через ssh и поставил серверу задачу сжать в один архив всё-всё-всё. И где-то через час "обнаружил" на сервере суровенький архив на 8 Гигабайт. Плюс ещё вытащил базу данных через phpmyadmim. Которая весила порядка сотни мегабайт. Самая крупная база веб-сайта, с которой мне приходилось сталкиваться на тот момент.

В общем, скачал я всё это дело на свой сервер. И через некоторе время приступил к оживлению сайта на новой площадке. Хотя ещё сначала была интересная история, когда я уничтожил свою флешку, на которой лежал архив. А в это время webfaction уже заблокировал доступ к старому сайту... К счастью, техподдержка хостинга восстановила доступ, сказав, что нам повезло, раз до сих пор данные не удалили. А если бы я не успел?!:< Спасибо, Саша, за такой фатальный "переезд"! Однако обошлось, фиу...)))

Итак. После практически ультра-фейла, и раскидав несколько резервных копий всем заинтересованным участникам процесса, я приступил к "рестарту" сайта. И первым делом разархивировал всё, что принёс на новый сервер. Сервер, кстати, был на базе FreeBSD + apache httpd + php + mysql. Значит создал я новую базу данных и залил в неё старую. После чего - проект ведь на Django - установил на сервер свежую версию этого фреймворка. И после этого полез смотреть, что я такого к себе "домой" притащил.

И увидел я после разархивации в папке vegopolis следующую картину:

директории

bin
data
downloads
lib
logs
removethis
rg
webapps


и два файла

rest 
high_load_mysqldump.log


Кстати, прошлые владельцы сайта дали мне контакты программиста, который в последнее время поддерживал сайт. Этот парень оказался из Германии. И на мой вопрос - "что мне важно особенного знать" сказал "да вроде ничего":) С изначальным же автором проекта, который всё это создал, связи давно не было. Интересная деталь - бывшие владельцы сказали, что он сейчас трудится в Google.

В общем, заручившись руководством по Django, я начал рыться в проекте.

В папке bin лежали какие-то скрипты.
В downloads - питоновские библиотеки, вероятно, зависимости проекта. Всё это потом очень пригодилось.
В lib лежал типа сам Python.
В logs - логи проекта.
В removethis - какое-то старьё, вероятно.
В rg - вообще какая-то хрень.
А вот в web_apps, как я понял, именно само веб-приложение и ещё гигантский склад загруженных пользователями картинок.

И самое интересное было в одной из подпапок webapps. Внутри ней лежал файл с расширением wsgi. Этот файл является своебразным списком настроек для того, чтобы объяснить веб-серверу, как запустить веб-приложение. Вот его содержимое:

import os, sys
sys.path.append('/home/vegopolis/webapps/site')
os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Из файла сразу стало понятно, что следующая точка поиска - это директория site. Зайдя в неё, я обнаружил то, что искал. Само веб-приложение. А конкретно - кучу директорий и файлов. С "говорящими" именами.

директории

chat
diary
locale
mailer
news
recaptcha
recipe
search
sitemap
snippets
sphene
static
templates
usermanagment
video


файлы

__init__.py
manage.py
settings.py
settings_local.py
urls.py


Поскольку, на старом хостинге пути к файлам несколько отличались от нынешней ситуации на моём сервере, то первым дело я постарался восстановить по мере возможности старую структуру. Зачем мне лишние заморочки? И после пары незначительных правок первый раз попытался зайти на сайт через браузер. Что бы Вы думали? Ошибка.

Полез в логи веб-сервера. Немного поправил его конфигурацию, чтобы настройки виртуального хоста указывали на тот самый файл с расширением wsgi. И... снова ошибка. Но уже не уровня веб-сервера. А, как указывали логи, внутри самого проекта.

Чуть-чуть порывшись, я понял, что на старом хостинге была установлена старая версия Django. А форумы рунета были наполненым жалобами о том, что на какой-то новой версии Django старые проекты на запускаются. И рядом советы - поставить старую версию Django:) Что я и сделал.

После чего поймал новую порцию ошибок. Что нет библиотеки с каким-то красивым названием. И тут я вспомнил про папку downloads. Именно там я и нашёл папку с названием, как в логах. Поставив нужный модуль, получил новую ошибку. С именем таким же, как и у соседней папки в downloads. В общем, следующие полчаса я только и делал, что ловил новую ошибку и ставил очередной модуль. И в один прекрасный момент, после установки, пожалуй, всех штук из downloads, я обновил в браузере vegopolis.ru и - сайт заскрипел, заскрипел и... запустился! Как мне показалось, в том же виде, в котором я его видел крайний раз, когда он ещё был в нормальном состоянии на webfaction.

В целом, сейчас я это понимаю, переезд оказался очень простым. Благодаря тому, что предыдущие веб-программисты хранили все зависимые библиотеки недалеко от основного кода. За что им большая благодарность! А то бы я там, пожалуй, ещё несколько часов пожил:)

Кстати, в итоге мы осознали, что моего сервера очень не хватает для нормальной жизни проекта. И сейчас буквально в течение двух-трёх дней Вегополис ожидает переезд на уже физический выделенный сервер. Где, мы надеемся, он будет жить долго и счастливо. Воспрянет из пепла, как птица-феникс. И в итоге превратится в центральный и самый лучший ресурс в рунете по вегетарианству. С интернет-магазином, большой библиотекой книг и видео и новым модулем социальной сети на базе децентрализованной Diaspora. Кстати, написанной на Ruby On Rails. Открою "секрет", в следующей и финальной части нашего цикла про веб-фреймворки, именно с ней мы и будем общаться:)

В заключение предлагаю Вам, уважаемые читатели, посмотреть содержимое файла settings.py, в котором записаны основные настройки достаточно крупного веб-приложения под названием "Вегополис". Надеемся, Вам было интересно прочитать про авторский опыт с проектом на Django:) Всего доброго!

(в целях безопасности кое-что удалено и изменено)

# Django settings for vegopolis project.

import os.path

AUTH_PROFILE_MODULE = 'usermanagment.UserProfile'

STATIC_MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'static').replace('\\', '/')
SMARKUP_ROOT = os.path.join(os.path.dirname(__file__), 'smarkup').replace('\\', '/')

MANAGERS = ADMINS

DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = "ololo"          # Or path to database file if using sqlite3.
DATABASE_USER = "kiskiskis"             # Not used with sqlite3.
DATABASE_PASSWORD = "maymay"       # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Europe/Moscow W-SU'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'ru-ru'

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../user_images').replace('\\', '/'))

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = 'http://vegopolis.ru/upload/'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
        'sphene.community.groupaware_templateloader.load_template_source',
        'django.template.loaders.filesystem.load_template_source',
        'django.template.loaders.app_directories.load_template_source',
        'django.template.loaders.app_directories.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',
        'django.core.context_processors.request',
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',
        'django.core.context_processors.media',
        'vegopolis.usermanagment.context_processors.user_statistics',
        'sphene.community.context_processors.navigation',
)

ROOT_URLCONF = 'vegopolis.urls'

TEMPLATE_DIRS = (
        os.path.join(os.path.dirname(__file__), 'templates/grappelli').replace('\\', '/'),
        os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
        os.path.join(os.path.dirname(__file__),'templates/sphene/'),
        os.path.join(os.path.dirname(__file__),'chat/templates/'),
        os.path.join(os.path.dirname(__file__),'search/templates/'),
        os.path.join(os.path.dirname(__file__),'diary/templates/'),
        os.path.join(os.path.dirname(__file__),'video/templates/'),
        os.path.join(os.path.dirname(__file__),'sitemap/templates/'),
        os.path.join(os.path.dirname(__file__),'recipe/templates/'),
)

INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.admin',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.comments',
        'django.contrib.sitemaps',
        'sorl.thumbnail',
        'grappelli',
        'filebrowser',
        'rosetta',
        'tagging',
        'vegopolis.mailer',
        'vegopolis.usermanagment',
        'vegopolis.news',
        'vegopolis.sphene.community',
        'vegopolis.sphene.sphboard',
        'vegopolis.chat',
        'vegopolis.search',
        'vegopolis.diary',
        'vegopolis.video',
        'vegopolis.sitemap',
        'vegopolis.recipe',
)

# thumbnail size
THUMB_WIDTH = 150
THUMB_HEIGHT = 150

# filebrowser
FILEBROWSER_DEBUG = False
FILEBROWSER_DIRECTORY = ''
FILEBROWSER_VERSIONS = {
        'fb_thumb': {'verbose_name': 'Admin Thumbnail', 'width': 60, 'height': 60, 'opts': 'crop upscale'},
        'thumb': {'verbose_name': 'Thumbnail', 'width': 85, 'height': 85, 'opts': 'crop upscale'},
        'thumbnail': {'verbose_name': 'Admin Thumbnail', 'width': 140, 'height': '', 'opts': ''},
        'small': {'verbose_name': 'Small', 'width': 300, 'height': '', 'opts': ''},
        'medium': {'verbose_name': 'Medium', 'width': 460, 'height': '', 'opts': ''},
        'big': {'verbose_name': 'Big', 'width': 620, 'height': '', 'opts': ''},
        'cropped': {'verbose_name': 'Cropped', 'width': 60, 'height': '60', 'opts': 'crop'},
        'croppedthumbnail': {'verbose_name': 'Cropped Upscale', 'width': 140, 'height': 140, 'opts': 'crop'},
        'news_thumb': {'verbose_name': 'News Thumbnail', 'width': 577, 'height': '', 'opts': 'crop upscale'},
}

# news
ITEMS_PER_PAGE = 25

#friends
FRIENDS_PER_PAGE = 25
USERS_PER_PAGE = 25
При копировании материала, ссылка на источник обязательна
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Avatar
очень интересно, мне кажется) легко написано, и остроумно)
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.