pycharm run/debug configuration. Примеры конфигураций
12 февраля 2014 г. 3:50
Конфигурации бывают нескольких видов. В моей практике распространены две:
- Django server - для запуска самого сайта.
- Python - для выполнения различных скриптов, у меня чаще всего management-команд.
Расмотрим в отдельности.
Запуск Django приложения в PyCharm (Пример конфигурации Django server)
У меня лично этот процесс происходит автоматически, то есть при открытии папки проекта (через меню "File \ Open...") PyCharm самостоятельно создаёт конфигурацию Django server с необходимыми настройками:
Если у меня открыть настройки, то он будут такими:
Атоматически распознать Django server и проставить настройки помогает структура папок проекта. У меня она выглядит следующим образом:
email_auth - приложение, кастомная модель пользователя.
env - виртуальное окружение.
media - сюда собираются все файлы загруженные через сайт.
spec - это простое приложение, которе выполняет некоторые функции сайта. У вас оно может по-другому называться.
static - папка со статическими файлами на уровне проекта.
templates - папка с шаблонами на уровне проекта.
Пример manage.py
from os.path import join, exists, abspath, dirname
import os
import sys
import subprocess
import shutil
PROJECT_ROOT = abspath(dirname(__file__))
REQUIREMENTS = join(PROJECT_ROOT, 'requirements.txt')
VE_ROOT = join(PROJECT_ROOT, 'env')
def go_to_ve():
# going into ve
if not sys.prefix == VE_ROOT:
if sys.platform == 'win32':
python = join(VE_ROOT, 'Scripts', 'python.exe')
else:
python = join(VE_ROOT, 'bin', 'python')
retcode = subprocess.call([python, __file__] + sys.argv[1:])
sys.exit(retcode)
delete_ve = 'del_ve' in sys.argv or 'delete_ve' in sys.argv
if delete_ve:
if exists(VE_ROOT):
print 'Deleting env...'
shutil.rmtree(VE_ROOT)
print 'Done.'
sys.exit(0)
update_ve = 'up_ve' in sys.argv or 'update_ve' in sys.argv
if update_ve:
# install ve
if not exists(VE_ROOT):
import virtualenv
print 'Creating virtualenv...'
virtualenv.logger = virtualenv.Logger(consumers=[])
virtualenv.create_environment(VE_ROOT, site_packages=False)
print 'Done.'
go_to_ve()
# check requirements
import pip
pip.main(['install', '-r', REQUIREMENTS])
sys.exit(0)
if exists(VE_ROOT):
go_to_ve()
# print 'Found virtualenv. Entering...'
try:
import settings
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory")
sys.exit(1)
if __name__ == '__main__':
if not delete_ve:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Пример settings.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
try:
import local_settings
except ImportError:
import local_settings_sample as local_settings
DEBUG = local_settings.DEBUG
ROOT_DIR = os.path.dirname(__file__)
ADMINS = (('Maltsev Artem', 'admin@vits.pro'), )
EMAIL_HOST = local_settings.EMAIL_HOST
EMAIL_PORT = local_settings.EMAIL_PORT
EMAIL_HOST_USER = local_settings.EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = local_settings.EMAIL_HOST_PASSWORD
EMAIL_USE_TLS = getattr(local_settings, 'EMAIL_USE_TLS', False)
EMAIL_USE_SSL = getattr(local_settings, 'EMAIL_USE_SSL', False)
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
MANAGERS = ADMINS
DATABASES = local_settings.DATABASES
TIME_ZONE = 'Asia/Irkutsk'
LANGUAGE_CODE = 'ru'
LANGUAGES = (('ru', 'Russian'), )
SITE_ID = 1
USE_I18N = True
USE_L10N = True
USE_TZ = True
USE_X_FORWARDED_HOST = True
MEDIA_ROOT = os.path.join(ROOT_DIR, 'media')
MEDIA_URL = "/media/"
STATIC_ROOT = os.path.join(ROOT_DIR, 'collect_static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(ROOT_DIR, 'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'sass_processor.finders.CssFinder',
'compressor.finders.CompressorFinder',
)
SECRET_KEY = local_settings.SECRET_KEY
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.gzip.GZipMiddleware',
'cms.middleware.language.LanguageCookieMiddleware',
'cms.middleware.user.CurrentUserMiddleware',
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.utils.ApphookReloadMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(ROOT_DIR, 'templates'), ],
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.template.context_processors.csrf',
'django.template.context_processors.request',
'django.contrib.messages.context_processors.messages',
'sekizai.context_processors.sekizai',
'cms.context_processors.cms_settings',
],
'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'admin_tools.template_loaders.Loader',
]),
]}
}, ]
ROOT_URLCONF = 'urls'
WSGI_APPLICATION = 'wsgi.application'
INSTALLED_APPS = (
'djangocms_admin_style',
'admin_tools',
'admin_tools.dashboard',
'django.contrib.auth',
'email_auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.sitemaps',
'djangocms_text_ckeditor', # note this needs to be above the 'cms' entry
'cms',
'treebeard',
'menus',
'sekizai',
'compressor',
'spec',
'sass_processor',
) + PROJECT_APPS
SILENCED_SYSTEM_CHECKS = ('auth.E003', 'auth.W004')
AUTH_USER_MODEL = 'email_auth.User'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
},
}
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True
}
}
}
ALLOWED_HOSTS = getattr(local_settings, 'ALLOWED_HOSTS', ['localhost', ])
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
if DEBUG:
INTERNAL_IPS = ('127.0.0.1', )
# --- CMS ---
CMS_TEMPLATES = (
('default.html', 'По умолчанию'),
)
# --- end CMS ---
Пример рабочего проекта
Для наглядности я подготовил рабочий демонстрационный проект, который вы можете скачать для наглядности:
Пример проекта без виртуального окружения (1,1 МБ)
Пример проекта с виртуальным окружением (36,4 МБ)
По идее, загрузив пример проекта с виртуальным окружением, и открыв его через меню "File \ Open...", PyCharm автоматически определит Django Server конфигурацию и вы сразу сможете запустить проект. Не забудьте только создать базу данных и применить миграции.
Пример простой конфигурации python-скрипта
Передо мной встала задача: написать скрипт оповещения клиентов об скором истечении срока действия услуг. Запуск скрипта должен производиться из консоли для того, чтобы его можно было добавить в cron. Решением этой задачи служит использование management команды.
Скрипт я написал: теперь самое время его протестировать и отладить в случае необходимости. И чтобы это было легче проводить, можно воспользоваться debug-ом в самом PyCharm-е. Для этого нужно добавить необходимую конфигурацию.
Добавить в PyCharm конфигурацию запуска обычного python скрипта достаточно просто: в списке конфигураций выбираем "Edit Configurations..." (на рисунке выделено синим цветом).
Затем щёлкаем по зелёному плюсику (выделено синей рамкой) и выбираем python:
А затем проделываем несколько нехитрых действий:
- Вписываем имя конфигурации в поле "Name". В моём случае client_notifications, и у меня часто имя конфигурации совпадает с именем самого скрипта - так удобно.
- Указываем полный путь до скрипта в "Script". Да, на скриншоте путь начинается с E :) Раньше под виндой сидел, теперь давно уже на Linux-е.
- Пишем параметры скрипта в "Script parameters". Имя файла моего скрипта client_notifications, поэтому его и пишем.
Нажимаем окей и можно дебажить!
Что касается поля "Interpreter options" - там указываются параметры самого интерпретатора python. По сути они вставляются между python и manage.py.
А "Working directory" можно не трогать. В данном случае он ни на что не влияет.
Запуск Django-Shop приложения в PyCharm
Разберём более сложный пример запуска конфигурации: попробуем запустить скаченный с какого-нибудь репозитория (напр., github) проект на Django. В качестве примера выберем Django Shop - платформа для создания интернет-магазина.
Для начала откроем терминал и склонируем проект с github:
git clone https://github.com/awesto/django-shop.git
Далее выполним специфичные команды для запуска Django Shop демо-примера (для каждого проекта свои команды по запуску!):
cd django-shop virtualenv ~/.virtualenvs/django-shop source ~/.virtualenvs/django-shop/bin/activate pip install -e . pip install -r requirements/test_py3.txt pip install Django==1.9.10 npm install # в версиях 0.9.3 и выше, сначала нужно зайти в папку example cd example export DJANGO_SHOP_TUTORIAL=commodity export DJANGO_DEBUG=True ./manage.py initialize_shop_demo ./manage.py compilescss
В общем случае для любого проекта нужно:
- Создать виртуальное окружение командой
virtualenv. - Войти в виртуальное окружение командой
source. - Установить зависимости (чаще всего они перечислены в файле requirements.txt) командой
pip install.
Другие выше перечисленные команды я не буду объяснять в данной статье, так как, ещё раз повторюсь, для каждого проекта свои команды по подготовке к запуску приложения.
И наконец, запускаем проект:
./manage.py runserver
Если в терминале получилось запустить проект, то переходим к его запуску в PyCharm. Для этого открываем в PyCharm-е наш проект:
Нам важно, чтобы мы смогли просматривать в PyCharm все файлы проекта, склонированного с github, поэтому выбираем корневую папку проекта django-shop.
Теперь нам нужно добавить поддержку Django для приложения. Для этого выбираем в меню: "File \ Settings ...":
В этом окне нужно настроить Django project root. Эту директорию можно выбирать такую, в которой лежит manage.py. После выбора директории вы заметите, что PyCharm сам попытался определить местонахождение manage.py и settings.py. Давайте ему поможем, определив точное месторасположение этих файлов. В случае с Django Shop settings.py лежит в папке myshop, поэтому щёлкаем на значок "Три точки" в соответствующем поле для открытия диалогового окна и находим наш settings.py.
Обратите внимание, что мы также добавили переменную окружения DJANGO_SHOP_TUTORIAL в поле Environment variables. Чуть ниже вы увидите, что переменные окружения также добавляются при создании конфигурации, и для Django Shop переменную DJANGO_SHOP_TUTORIAL нужно задавать в двух местах, потому что этот проект требует обязательного наличия DJANGO_SHOP_TUTORIAL в переменных окружения. А так как запуск management команд через PyCharm (гор. клавиша Ctrl + Alt + R) таких, как makemigrations или migrate, происходит в отдельной конфигурации, поэтому без указания DJANGO_SHOP_TUTORIAL команды не смогут запуститься и выведут такую ошибку django.core.exceptions.ImproperlyConfigured: Environment variable DJANGO_SHOP_TUTORIAL is not set:
Поэтому поставим DJANGO_SHOP_TUTORIAL=commodity.
Теперь проверим правильно ли выбрано виртуальное окружение для проекта. Переходим в Project Interpreter:
Командой virtualenv ~/.virtualenvs/django-shop было установлено виртуальное окружение для проекта, поэтому проверьте, чтобы в поле Project Interpreter путь совпадал: 2.7.6 virtualenv at ~/.virtualenvs/django-shop. Найти этот путь можно щёлкнув на крайнюю справа стрелочку вниз этого поля. Если в списке нет пути до виртуального окружения, то можно его вручную добавить, щёлкнув на значок шестерёнки (правее стрелки влево):
Теперь закрываем окно настроек, и последнее что нам осталось сделать, это добавить конфигурацию запуска проекта. Для этого щёлкаем Edit Configuration:
И, щёкнув на плюсик, выбираем Django Server:
Теперь остаётся заполнить Environment variables по необходимости:
DJANGO_SHOP_TUTORIAL=commodity DJANGO_DEBUG=True DJANGO_SETTINGS_MODULE=myshop.settings
Имейте ввиду, что, если у вас в переменных окружения DJANGO_SETTINGS_MODULE=settings:
или в manage.py записан путь до settings.py неправильным образом:
#!/usr/bin/env python
import os
import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
вместо myshop.settings. То возникнет ошибка:
ImportError: No module named settings
Так как в переменных окружения значение переменной DJANGO_SETTINGS_MODULE должно быть равно правильному пути до settings.py. В нашем примере с Django Shop DJANGO_SETTINGS_MODULE=myshop.settings.
Похожие статьи:
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0