Мы установили Python 3.7

Настроили виртуальное окружение

Установили и настроили Postgresql

Далее внутри виртуального окружения ставим необходимый пакет программ

Ставим Django и Gunicorn внутри виртуального окружения.

Gunicorn будет выступать в качестве HTTP сервера для сайта.

(dj-project) $ pip3 install django gunicorn

Смотрим какие при этом зависимости установились

(dj-project) $ pip3 freeze
Django==2.2.4

Создаём Django-проект

(dj-project) $ django-admin.py startproject myproject

Сохраняем зависимости

(dj-project) $ pip freeze > myproject/requirements.txt 

Настройка проекта

После этого нужно настроить проект. Откройте файл settings.py в текстовом редакторе:

 $ mcedit  /var/www/myprojectdir/myproject/settings.py
Находим в файле директиву ALLOWED_HOSTS. Она содержит белый список адресов и доменов, которые могут подключаться к Django. Если входящий запрос содержит заголовок Host, который не включен в этот список, такой запрос будет сброшен. Это обеспечит дополнительный уровень безопасности Django.

Перечислите в квадратных скобках все заведомо безопасные для Django IP-адреса или домены. Каждый элемент нужно взять в одинарные кавычки. Все элементы списка разделяются запятыми. Чтобы добавить в список поддомены, поставьте перед доменным именем точку. В приведённом ниже фрагменте вы найдёте несколько закомментированных примеров того, как может выглядеть директива ALLOWED_HOSTS.
При DEBUG равном True и при выполнении тестов проверка отключена. Проверка обычно нужна только на боевом сервере.

Примечание: Обязательно укажите localhost как один из параметров, поскольку позже мы будем проксировать соединения через локальный экземпляр Nginx.

Затем находим раздел настроек доступа к БД — DATABASES. Указваем имя БД, имя и пароль пользователя базы данных, а затем укажите, что база данных находится на локальном компьютере.

'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'django_db',
'USER' : 'user_name',
'PASSWORD' : 'password',
'HOST' : '127.0.0.1',
'PORT' : '5432',

Переходим в конец файла и указываем, где должны находиться статические файлы. Это необходимо для того, чтобы веб-сервер Nginx мог обрабатывать запросы по этим файлам. Следующая строка поместит эти файлы в каталог под названием static в каталоге проекта:

 STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

В окружении проекта устанавливаем бэкэнд для PostgreSQL

(dj-project) $ pip install  psycopg2
 При ошибке Error: pg_config executable not found.  

Указываем путь до pg_config

PATH=$PATH:/usr/lib/postgresql/12/bin/

и устанавливаем пакет для разработки клиентских приложений и серверных расширений.

Выполнение миграций базы данных

Django обладает одним очень большим преимуществом — он имеет встроенную админку, что очень облегчает жизнь. Но чтобы она заработала, необходимо выполнить миграцию базы данных, то есть подготовить из моделей данных SQL запросы, которые сформируют структуру базу данных.

 cd ./myproject
(dj-project)python manage.py makemigrations
(dj-project)python manage.py migrate

А ещё создадим суперпользователя, который будет администратором с максимальными правами доступа к вашему сайту. Выполните следующую команду и следуйте инструкциям.

(dj-project)python manage.py createsuperuser

Переместите весь статический контент в подготовленный каталог:

(dj-project)python manage.py collectstatic

Подтвердите операцию. Теперь все статические файлы хранятся в каталоге static.

Теперь можно протестировать проект, запустив сервер разработки Django

(dj-project)python manage.py runserver 0.0.0.0:8000 

Открываем в браузере доменное имя или IP-адрес и указываем порт :8000.

http://server_domain_or_IP:8000

На экране появится приветственная страница Django.

Добавьте /admin в конец адреса. Браузер запросит учётные данные администратора. Заполните поля, указав имя и пароль только что созданной учётной записи администратора при помощи команды createsuperuser. После этого на экране появится интерфейс администратора.

Завершив проверку, останавливаем сервер разработки, нажав CTRL-C в окне терминала.

gunicorn --bind 0.0.0.0:8000 myproject.wsgi

Эта команда запустит Gunicorn в том же интерфейсе, в котором до этого работал сервер разработки Django. Вернемся и снова протестируем приложение.

Примечание: Поскольку Gunicorn не знает о расположении статического контента для интерфейса администратора, интерфейс будет отображаться без использования стилей.

Завершим проверку, останавливаем Gunicorn, нажав CTRL-C в окне терминала.

Создание системных сокетов и служебных файлов для Gunicorn

Мы проверили, что Gunicorn может взаимодействовать с нашим приложением Django, но мы должны реализовать более надежный способ запуска и остановки сервера приложений. Для этого мы создадим файлы службы systemd и сокетов.

Сокет Gunicorn будет создан при загрузке и будет прослушивать соединения. Когда происходит соединение, systemd автоматически запускает процесс Gunicorn для обработки соединения.

Создадим файла сокета systemd для Gunicorn:

sudo mcedit /etc/systemd/system/gunicorn.socket

Внутри мы создадим
[Unit] раздел для описания сокета,
[Socket] раздел для определения местоположения сокета и
[Install] раздел, чтобы убедиться, что сокет создан в нужное время:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target

Далее создаем служебный файл systemd для Gunicorn. Имя файла службы должно соответствовать имени файла сокета, за исключением расширения:

sudo mcedit  /etc/systemd/system/gunicorn.service

Начните с [Unit]раздела, который используется для указания метаданных и зависимостей. Мы поместим здесь описание нашего сервиса и сообщим системе инициализации запускать его только после того, как цель сети достигнута. Поскольку наш сервис опирается на сокет из файла сокета, нам нужно включить Requires директиву, чтобы указать эту связь:

[Unit] раздел, который используется для указания метаданных и зависимостей. Мы поместим здесь описание нашего сервиса и сообщить системе инициализации запускать его только после того, как цель сети достигнута. Поскольку наш сервис запускается через сокет, нам нужно включить Requires директиву, чтобы указать эту связь:

[Service] раздел. Здесь мы определим пользователя и группу, под которой мы хотим работать. Предоставим доступ группе www-data, чтобы Nginx мог легко общаться с Gunicorn.

Затем укажем рабочий каталог и команду для запуска сервиса. В этом случае нам нужно будет указать полный путь к исполняемому файлу Gunicorn, который устанавливается в нашей виртуальной среде. Свяжем процесс с сокетом Unix, который мы создали в /run каталоге, чтобы процесс мог взаимодействовать с Nginx. Записываем все данные в стандартный вывод, чтобы journald процесс мог собирать журналы Gunicorn. Также можем указать любые дополнительные настройки Gunicorn здесь. Например, мы указали 3 рабочих процесса:

[Install] раздел. Он указывает systemd, с чем связать этот сервис, если мы включим его при загрузке. Мы хотим, чтобы эта служба запускалась и работала, когда обычная многопользовательская система:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myprojectdir/myproject/
ExecStart=/var/www/myprojectdir/venv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application
[Install]
WantedBy=multi-user.target

Теперь запустим и включим сокет Gunicorn. Следующие команды создадут файл сокета /run/gunicorn.sock сейчас и при следующей загрузке системы Когда будет установлено соединение с этим сокетом, systemd автоматически начнет обрабатывать его gunicorn.service :

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

Для того чтобы проверить , что операция прошла успешно, проверив наличие файла сокета.

Проверка на наличие файла сокета Gunicorn

Проверьте состояние процесса:

 sudo systemctl status gunicorn.socket

Далее, проверьте наличие gunicorn.sock файла в /runкаталоге:

file /run/gunicorn.sock
Output
/run/gunicorn.sock: socket

Если в результате работы команды systemctl status произошла ошибка, или если вы не нашли gunicorn.sock файл в каталоге, это означает, что сокет Gunicorn не был создан правильно. Проверьте логи сокета Gunicorn, набрав:

 sudo journalctl -u gunicorn.socket

Еще раз посмотрите настройки в файле /etc/systemd/system/gunicorn.socket и исправить проблемы, прежде чем продолжить.

Для проверки работы и активации сокета, подключимся curl через сокет :

curl --unix-socket /run/gunicorn.sock localhost

В консоли должно быть отображено содержание HTML страницы. Это указывает на то, что Gunicorn был запущен и смог обработать ваше приложение Django.

Проверяем что служба Gunicorn работает:

sudo systemctl status gunicorn

Если возникли проблемы после curl или systemctl status, проверяем в журналах дополнительную информацию:

 sudo journalctl -u gunicorn

Проверяем и при необходимости вносим изменения /etc/systemd/system/gunicorn.service. После внесения изменении файл /etc/systemd/system/gunicorn.service, необходимо перезагрузите демон, чтобы перечитать конфиг сервиса и перезапустить процесс Gunicorn:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Настроить Nginx на Proxy Pass для Gunicorn

Теперь, когда Gunicorn настроен, нам нужно настроить Nginx.

Создаем нового виртуальный сервер Nginx :

sudo mcedit /etc/nginx/sites-available/myproject

В блоке server. Указываем что будем прослушивать порт 80 и он должен отвечать на доменное имя или IP-адрес нашего сервера:

server {
    listen 80;
    server_name server_domain_or_IP;

    location /static/ {
        root /var/www/myprojectdir/myproject;
    }

    location = /favicon.ico {
        alias /var/www/myprojectdir/myproject/static/favicon.ico;
    }
    location = /favicon.ico { access_log off; log_not_found off; }

    location = /robots.txt {
        alias /var/www/myprojectdir/myproject/static/robots.txt;
    }
    location /media/ {
        root /var/www/myprojectdir/myproject/media;
    }
    # Взаимодействуем с Django-приложением через unix-сокет
    location / {
        include proxy_params;
        include     /etc/nginx/uwsgi_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Проверим конфигурацию Nginx на наличие синтаксических ошибок:

 sudo nginx -t 

Если ошибок нет, перезапускаем Nginx:

sudo systemctl restart nginx

В этой статье рассмотрим как установить из пакетов, а также как загрузить и скомпилировать из исходного кода Python 3.7, 3.8:

Сначала обновим список пакетов и установим пакеты, необходимые для сборки исходного кода:
Continue Reading

PyCharm 4.0.1, is a Python IDE with unique code assistance and analysis, for productive Python development on all levels. It’s an intelligent Editor, with code completion, on-the-fly error highlighting, auto-fixes. Its got support for modern web development frameworks, such as Django, Flask, Google App Engine, Pyramid, web2py, etc.
Continue Reading

На ресурсах, посвященных Python или Django можно часто встретить упоминания неких виртуальных окружений и программы virtualenv. Информация на официальном сайте дает понять, что это кое-что полезное. И не зря его всячески рекомендуют к использованию.

Совсем недавно я переустановил систему и еще не успел поставитьDjango и пр. инструменты. Поэтому, самое время организовать всю дальнейшую работу на основе виртуальных окружений. В статье пойдет речь о том, что такоеvirtualenv, зачем он нужен, как его установить и использовать. Черновая редакция.

Как установить virtualenv или «курица vs яйцо»

На официальном сайте virtualenv в разделе «Installation» рекомендуется устанавливатьvirtualenv через менеджер Python-пакетов pip (командой «pip install virtualenv»). Однако далеко не всегда pip установлен в системе по-умолчанию. Я не стал исключением: команду pipсистема не понимает. Идем на официальный сайт и видим, что pip рекомендуется использовать в пределах виртуального окружения virtualenv. При установке virtualenv, pipустанавливается автоматически. Выходит, официальные сайты обеих программ рекомендуют устанавливать virtualenv через pip, а pip — через virtualenv. Хм...

Примечание: есть, конечно, множество других способов установки того и другого (через easy_install, скачивание deb-пакетов или python-установщиков) —  все эти способы также описаны на официальных сайтах или на чьих-то блогах. Но все-таки что-то тянет меня придерживаться рекомендуемых способов от официальных разработчиков.

Если следовать концепции виртуальных окружений — логично использовать pip в пределахvirtualenv, а не глобально во всей системе. Тем более нахаляву, что и поставится он автоматически вместе с virtualenv. Значит, прежде всего нужно устанавливать virtualenv. Как?

На мой взгляд, лучшее Linux-way решение - установка из репозиториев (почему-то этот вариант не упоминается на официальном сайте virtualenv).

1. Для установки virtualenv набираем в терминале:
sudo apt-get install python-virtualenv

2. Создаем папку, внутри которой будут храниться папки будущих виртуальных окружений. Лучше всего создать такую папку в пределах своей домашней директории, чтобы не было проблем с правами доступа. Поскольку вручную копаться в ней врядли придется, сделаем ее скрытой и назовем «.virtualenvs»:
mkdir .virtualenvs

Внутри этой папки можно создавать виртуальные окружения под каждый из наших будущих проектов.

3. Создаем виртуальное окружение внутри папки .virtualenvs. Пусть наше первое виртуальное окружение будет называться «project_one».
cd .virtualenvs
virtualenv project_one

(Аналогично могут создаваться виртуальные окружения для каких-то других проектов).
В результате внутри папки /.virtualenvs/project_one/ создастся маленькая рабочая среда с папками bin/, include/, lib/, local/, содержащими минимальный «набор джентльмена» для работы — python, менеджеры пакетов pip и easy_install. Сюда же могут доставляться все необходимые пакеты, фреймворки (в том числе Django) и утилиты. В пределах каждого виртуального окружения они будут изолированы друг от друга, не оказывая никакого взаимного «паразитного» влияния.

Примечание: во многих руководствах по работе с виртуальными окружениями рекомендуется выполнять команду virtualenv с ключом --no-site-packages. Применение этого ключа позволяет создавать виртуальное окружение, изолированное от системной питоновской папки site-packages, что повышает степень автономности. Так вот в новых версиях virtualenv указывать этот ключ не обязательно, поскольку в них эта опция включена по-умолчанию.

4. Для активации необходимого виртуального окружения нужно зайти в его папку («cd project_one») и выполнить следующее:
source bin/activate

После активации командная строка изменится: перед именем пользователя появится название виртуального окружения в скобках «(project_one)имя_пользователя>@имя_компьютера ~».

virtualenv_scr1
Теперь любые команды по установке пакетов (например, «pip install django») или по их удалению будут выполнятся только в пределах активированного окружения.

Для выхода из виртуального окружения и перехода в обычный режим достаточно набрать:
deactivate

5. Для более удобной работы с virtualenv рекомендуется поставить утилиту под названиемvirtualenvwrapper. Это специальная надстройка над virtualenv, которая избавит от необходимости заходить в определенную папку для включения виртуального окружения и обеспечит прочие «ништяки». Поставив ее, можно будет переключаться между виртуальными окружениями одним взмахом руки одной командой, вызванной откуда угодно. Итак, устанавливаем:
sudo apt-get install virtualenvwrapper

Следуя, рекомендациям разработчиков, для настройки virtualenvwrapper на нашу папку с виртуальными окружениями, добавляем следующий текст в файл ~/.profile (чтобы эти настрйоки выполнялись при каждой загрузке компа):
export WORKON_HOME=$HOME/.virtualenvs
source /etc/bash_completion.d/virtualenvwrapper

Чтобы наши изменения настроек вступили в силу без перезагрузки, запускаем на выполнение файл .profile:
source ~/.profile

6. Теперь работа с виртуальными окружениями стала еще проще:
mkvirtualenv env_name1     — создать в папке с вирт.окружениями окружение «env_name1»
workon env_name1              - переключится в окружение «env_name1»
lsvirtualenv                           — вывести список доступных виртуальных окружений
rmvirtualenv env_name1      - удалить виртуальное окружение «env_name1»
deactivate                              - выйти из текущего виртуального окружения

PyCharm могу сказать без тени сомнения, что это — самая мощная среда разработки приложений на Python / Django. Поддерживает практически все, что может пригодится Python-программисту, а то, что не поддерживает — компенсируется огромным количеством различных плагинов для этой среды. Почитать, что она умеет, посмотреть скриншоты и видео можно на [urlspan]официальном сайте[/urlspan].

Как установить PyCharm в Ubuntu

Для работы обязательно наличие в системе виртуальной машины Java. Поэтому, первым делом займемся Java'ой.

1. Устанавливаем виртуальную машину Java (если еще не установлена).

Примечание: как проверить установлена ли Java? Достаточно набрать в консоли:

Если появляется сообщение об отсутствии пакета — значит Java не установлена. По-умолчанию Java не включена в дистрибутив Ubuntu 12.04. Поэтому если у вас свежая только-что-установленная система — то устанавливаем Java по инструкции ниже. Если не свежая или в системе присутствует старая версия Java или OpenJDK, то ее желательно удалить. Удалять пакеты можно с помощью менеджера пакетов (например, Synaptic) или командой:

     sudo apt-get purge openjdk-*

Установку Java удобнее всего проводить из стороннего репозитория. Набираем в терминале:

— добавляем репозиторий с устновщиком Java

     sudo add-apt-repository ppa:webupd8team/java

— обновляем информацию о содержимом репозиториев

     sudo apt-get update

— устанавливаем пакет-инсталлятор Java

     sudo apt-get install oracle-java8-installer

После установки oracle-java8-installer самостоятельно скачает все необходимые пакеты с серверов Oracle и произведет установку виртуальной машины Java.

2. Скачиваем последнюю версию  с [urlspan]официального сайта[/urlspan].

3. Распаковываем содержимое скачанного архива (.tar.gz) в папку /opt/.
Согласно стандарту [urlspan]FHS[/urlspan], дополнительное программное обеспечение устанавливается в папку/opt/. Будем следовать этому стандарту, поэтому содержимое архива  желательно распаковать именно в эту папку.
Как это сделать:
— переносим скачанный архив в папку /opt/.

     sudo mv pycharm-2.6.3.tar.gz /opt/

— переходим в папку /opt/.

     cd /opt/

— распаковываем архив в текущей папке.

     sudo tar -xzvf /opt/pycharm-2.6.3.tar.gz
  • Ключ -x — извлечь файлы из архива (extract)
  • Ключ -z — пропустить архив через gzip
  • Ключ -v — вывести подробный листинг обрабатываемых файлов (verbose)
  • Ключ -f -обработать указанный файл

После распаковки дополнительно можно удалить скачанный архив, дабы не занимал лишнее место:

     sudo rm pycharm-2.6.3.tar.gz

Если все прошло без ошибок, то на этом установка завершена.

Как запустить PyCharm

Для запуска  в Linux служит скрипт pycharm.sh, который находится в папке /bin/ программы. Сразу после установки программу можно запустить, находясь в папке/opt/pycharm-2.6.3/ (важно) и набрав в терминале:

     bin/pycharm.sh

Но каждый раз открывать терминал, заходить в нужную папку и набирать команду, мягко говоря, не удобно. Поэтому лучше один раз создать символическую ссылку на этот файл (своего рода ярлык, только не визуальный):

     sudo ln -s /opt/pycharm-2.6.3/bin/pycharm.sh /usr/bin/pycharm

Наличие символической ссылки в /usr/bin/ позволяет запускать нашу IDE простой командойpycharm, набранной в главном меню (Dash) по нажатию Alt+F2 (в Ubuntu 12.04).

Примечание: выполнять  в терминале не рекомендуется, поскольку в этом случае он будет зависеть от терминала, в котором больше ничего нельзя будет сделать, а закрытие терминала приведет к закрытию PyCharm.

Если такой вариант вам неудобен, то можно создать ярлык. Как создать ярлык в конкретной системе — зависит от дистрибутива Linux, в одних это сделать легче, в других — чуть сложнее.

Как создать ярлык:
Создаем файл ярлыка pycharm.desktop:

  • Ubuntu:      gedit ~/.local/share/applications/pycharm.desktop
  • Linux Mint:      gedit ~/Рабочий стол/pycharm.desktop  или  gedit ~/Desktop/pycharm.desktop - в зависимости от установленного языка

В файле пишем следующий текст и сохраняем:
[Desktop Entry]
Name=PyCharm
Comment=Среда разработки PyCharm
GenericName=PyCharm
Keywords=PyCharm;Python;Django;IDE;
Exec=/usr/bin/pycharm
Terminal=false
Type=Application
Icon=/opt/pycharm-2.6.3/bin/pycharm.png
Categories=
Path=/opt/pycharm-2.6.3/bin/

Примечание: подробное объяснение этих действий находится [urlspan]здесь[/urlspan].

Иногда созданный файл нужно сделать исполняемым (наиболее просто — поставить соответствующие галочки в свойствах файла).

Все. Если у вас Ubuntu, то теперь в главном меню (Dash) по запросу PyCharm будет выводиться созданный ярлык, который при желании можно перетянуть на главную панель. Если у вас Linux Mint, то ярлык сразу появится прямо на рабочем столе.