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