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