Python

Установка модуля Python

Для начала рассмотрим установку модулей для Python. Как правило, модуль можно установить пакетным менеджером pip, для этого необходимо перейти в окружение Docker, подробнее с работой в нём можно ознакомится в этой статье. В качестве примера установим библиотеку Pillow:

(docker) denia059@plasma:~ [0] $ pip3 install pillow --user --ignore-installed
Collecting pillow
  Downloading https://files.pythonhosted.org/packages/d2/c2/f84b1e57416755e967236468dcfb0fad7fd911f707185efc4ba8834a1a94/Pillow-6.0.0-cp36-cp36m-manylinux1_x86_64.whl (2.0MB)
    100% |==========================================>| 2.0MB 532kB/s

Installing collected packages: pillow

Successfully installed pillow-6.0.0

! При установке модулей использование флага --user является обязательным.
Дожидаемся окончания операции. Готово, модуль установлен в каталог:

~/.local/lib/python3.6/site-packages/PIL

Чтобы Ваш сайт увидел модуль, необходимо добавить в переменную окружения путь до него:

import os, sys
sys.path.append('/home/u/user/.local/lib/python3.6/site-packages/PIL')

Либо так:

import os, sys
sys.path.insert(0,'/home/u/user/.local/lib/python3.6/site-packages/PIL')

Вместо /u/user необходимо указать первую букву Вашего логина и сам логин. Например, для логина pythontest путь будет /home/p/pythontest/.local/lib/python3.6/site-packages/PIL.

Если требуется установить дополнительные пакеты определенных версий, необходимо указать их в файле requirements.txt. Это удобно тем, что из одного файла можно установить большой список пакетов для Python.

В качестве примера из файла requirements.txt установим следующие пакеты:

(docker) denia059@plasma:~ [0] $ cat requirements.txt
pytsite==8.16.3
pygal==2.4.0
Pillow==6.0.0
django-mobile==0.7.0
django-silver==0.9

Затем запустим команду для установки всех модулей и их зависимостей из данного файла следующей командой:

(docker) denia059@plasma:~ [0] $ pip3 install -r requirements.txt --user --ignore-installed
Collecting PytSite (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/6c/85/c8153ba88d72de4b409880c4afa1ae3ff1fe0e8f17e55588ffe094b5899b/pytsite-8.16.3-py3-none-any.whl (118kB)
    100% |==========================================>| 122kB 2.0MB/s

Collecting pygal (from -r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/5f/b7/201c9254ac0d2b8ffa3bb2d528d23a4130876d9ba90bc28e99633f323f17/pygal-2.4.0-py2.py3-none-any.whl

Collecting django-silver (from -r requirements.txt (line 3))
  Using cached https://files.pythonhosted.org/packages/54/43/e0b0012da69ecdb1ea03d1d8f1ea046459bd31353e9c780a4554bd4068bc/django-silver-0.9.tar.gz
    ...

Использование нескольких версий Python

Для некоторых web-приложений могут потребоваться разные версии Python. На большинстве серверов в Docker-контейнере установлено несколько вариантов:

/usr/bin/python2.7
/usr/bin/python3.6
/usr/bin/python3.7

Например, чтобы установить пакет для определенной версии Python, выполните команду:

pythonX.X -m pip install название_пакета --user --ignore-installed

где X.X - нужная версия Python. Чтобы установить Pillow для python 3.7, команда будет выглядеть так:

(docker) django17@quasar:~ [0] $ python3.7 -m pip install pillow --user --ignore-installed

Локальная установка Python

Для некоторых web-приложений может потребоваться версия Python, отличная от тех, что предоставляются на хостинге. В таком случае необходимую версию можно собрать локально.

Подключимся по SSH к серверу и скомпилируем Python из исходного кода. Инструкция для подключения по SSH описана в статье Общие сведения по установке приложений (виртуальное окружение Docker).

Теперь перейдем во временный каталог на аккаунте:

(docker) django17@quasar:~ [0] $ cd ~/.beget/tmp/

Если каталог не создан, создайте его и затем перейдите:

(docker) django17@quasar:~ [0] $ mkdir -p ~/.beget/tmp
(docker) django17@quasar:~ [0] $ cd ~/.beget/tmp/

Для сборки Python версии 3.7.0 и выше потребуется собрать библиотеку ffi. Если вам необходима версия ниже 3.7.0, то данный шаг можно пропустить и перейти сразу к сборке Python.

Скачиваем исходный код библиотеки:

(docker) django17@quasar:~/.beget/tmp [0] $ wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
--2019-06-26 10:50:10--  ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
           => ‘libffi-3.2.1.tar.gz’
Resolving sourceware.org (sourceware.org)... 209.132.180.131
Connecting to sourceware.org (sourceware.org)|209.132.180.131|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /pub/libffi ... done.
==> SIZE libffi-3.2.1.tar.gz ... 940837
==> PASV ... done.    ==> RETR libffi-3.2.1.tar.gz ... done.
Length: 940837 (919K) (unauthoritative)

libffi-3.2.1.tar.gz  100%[========================================>] 918,79K   377KB/s    in 2,4s

2019-06-26 10:50:16 (377 KB/s) - ‘libffi-3.2.1.tar.gz’ saved [940837]
    ...

Распакуем архив и сразу перейдем в каталог с исходным кодом:

(docker) django17@quasar:~/.beget/tmp [0] $ tar -xf libffi-3.2.1.tar.gz && cd libffi-3.2.1

С помощью утилиты configure настроим все зависимости, префиксы, переменные, после чего будет сгенерирован Makefile:

(docker) django17@quasar:~/.beget/tmp/libffi-3.2.1 [0] $ ./configure --prefix $HOME/.local LDFLAGS="-L/usr/local/lib"
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
continue configure in default builddir "./x86_64-unknown-linux-gnu"
...
config.status: build in x86_64-unknown-linux-gnu (HOST=)
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing include commands
config.status: executing src commands

Теперь запустим процесс компиляции и установки:

(docker) django17@quasar:~/.beget/tmp/libffi-3.2.1 [0] $ make -j33 && make install
MAKE x86_64-unknown-linux-gnu : 0 * all-all
make[1]: Entering directory '/home/r/r91115vb/.beget/tmp/libffi-3.2.1/x86_64-unknown-linux-gnu'
make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-O3 -fomit-frame-pointer -fstrict-aliasing -ffast-math -march=core2  -Wall -fexceptions' 'CXXFLAGS=-g -O2' 'CFLAGS_FOR_BUILD=' 'CFLAGS_FOR_TARGET=' 'INSTALL=/usr/bin/install -c' 'INSTALL_DATA=/usr/bin/install -c -m 644' 'INSTALL_PROGRAM=/usr/bin/install -c' 'INSTALL_SCRIPT=/usr/bin/install -c' 'JC1FLAGS=' 'LDFLAGS=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=make' 'MAKEINFO=/bin/bash /home/r/r91115vb/.beget/tmp/libffi-3.2.1/missing makeinfo ' 'PICFLAG=' 'PICFLAG_FOR_TARGET=' 'RUNTESTFLAGS=' 'SHELL=/bin/bash' 'exec_prefix=/home/r/r91115vb/.local' 'infodir=/home/r/r91115vb/.local/share/info' 'libdir=/home/r/r91115vb/.local/lib' 'mandir=/home/r/r91115vb/.local/share/man' 'prefix=/home/r/r91115vb/.local' 'AR=ar' 'AS=as' 'CC=gcc' 'CXX=g++' 'LD=/usr/bin/x86_64-linux-gnu-ld -m elf_x86_64' 'NM=/usr/bin/nm -B' 'RANLIB=ranlib' 'DESTDIR=' all-recursive
make[2]: Entering directory '/home/r/r91115vb/.beget/tmp/libffi-3.2.1/x86_64-unknown-linux-gnu'
Making all in include
...

В директории с исходным кодом libffi-3.2.1/x86_64-unknown-linux-gnu/include сгенерируются два файла: ffi.h и ffitarget.h. Их копируем в ~/.local/include:

(docker) django17@quasar:~/.beget/tmp/libffi-3.2.1 [0] $ mkdir -p ~/.local/include
(docker) django17@quasar:~/.beget/tmp/libffi-3.2.1 [0] $ cp x86_64-unknown-linux-gnu/include/ffi.h ~/.local/include/
(docker) django17@quasar:~/.beget/tmp/libffi-3.2.1 [0] $ cp x86_64-unknown-linux-gnu/include/ffitarget.h ~/.local/include/

Готово! Теперь переходим к сборке самого Python.

На момент написания статьи последняя версия 3.7.3, скачать актуальную версию можно с официального сайта:

(docker) django17@quasar:~ [0] $ cd ~/.beget/tmp
(docker) django17@quasar:~/.beget/tmp [0] $ wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

Распакуем архив и сразу перейдем в каталог с исходным кодом:

(docker) django17@quasar:~/.beget/tmp [0] $ tar -xf Python-3.7.3.tgz && cd Python-3.7.3

С помощью утилиты configure настроим все зависимости, префиксы, переменные, после чего будет сгенерирован Makefile:

(docker) django17@quasar:~/.beget/tmp/Python-3.7.3 [0] $ ./configure --prefix=$HOME/.local LDFLAGS="-L/usr/local/lib"

Теперь запустим процесс компиляции и установки:

(docker) django17@quasar:~/.beget/tmp/Python-3.7.3 [0] $ make -j33 && make install

Проверим корректность установки:

(docker) django17@quasar:~ [0] $ ~/.local/bin/python3 -V
Python 3.7.3

Помимо Python также устанавливается пакетный менеджер pip:

(docker) django17@quasar:~ [0] $ ~/.local/bin/pip3 -V
pip 19.0.3 from /home/r/r91115vb/.local/lib/python3.7/site-packages/pip (python 3.7)

Настройка окружения virtualenv

Если сайтов, использующих Python на аккаунте несколько, то для каждого может потребоваться свое окружение и свой набор пакетов разных версий, которые могут конфликтовать между собой. Эту проблему можно решить настройкой виртуального окружения с помощью virtualenv.

Сначала устанавливаем сам virtualenv:

(docker) django17@quasar:~/django17.beget.tech [0] $ pythonX.X -m pip install virtualenv --user --ignore-installed

где X.X - версия Python (2.7, 3.6 или 3.7).

Если у вас собранный локально Python, то указывайте полный путь до pip:

(docker) django17@quasar:~/django17.beget.tech [0] $ ~/.local/bin/pip3 install virtualenv

Чтобы создать директорию окружения с названием venv, выполните команду:

(docker) django17@quasar:~/django17.beget.tech [0] $ pythonX.X -m virtualenv venv

где X.X - версия Python (2.7, 3.6 или 3.7).

Для локально собранного Python выглядит так:

(docker) django17@quasar:~/django17.beget.tech [0] $ ~/.local/bin/python3.7 -m virtualenv venv

Для входа в окружение выполните следующую команду:

(docker) django17@quasar:~/django17.beget.tech [0] $ source venv/bin/activate

Проверяем, что вход выполнен успешно:

(docker) django17@quasar:~/django17.beget.tech [0] $ which python
/home/d/django17/django17.beget.tech/venv/bin/python

Теперь мы можем устанавливать все необходимые пакеты для данного окружения с помощью pip (при этом полный путь до него указывать уже не нужно):

(docker) django17@quasar:~/django17.beget.tech [0] $ pip install django

Чтобы выйти из окружения, выполните команду:

(docker) django17@quasar:~/django17.beget.tech [0] $ deactivate

Установка и настройка Django

Django (Джанго) — свободный фреймворк для веб-приложений на языке Python. Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). В этой статье будет рассмотрена установка этого фреймворка на хостинг Beget. Для установки Django будет использоваться Python 3.6. При необходимости можете использовать другую версию Python, установив её локально, как описано выше.

Сначала необходимо перейти в виртуальное окружение сервера (Docker), подробнее можно ознакомится по ссылке Общие сведения по установке приложений (виртуальное окружение Docker):

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 4.0.4-3-beget-acl x86_64)

 * Documentation:  https://help.ubuntu.com/
(docker) django17@quasar:~ [0] $

Для установки фреймворка Django используется пакетный менеджер pip, который автоматически устанавливает последнюю версию:

(docker) django17@quasar:~/django17.beget.tech [0] $ pip3 install django --user --ignore-installed
Collecting django
  Using cached https://files.pythonhosted.org/packages/eb/4b/743d5008fc7432c714d753e1fc7ee56c6a776dc566cc6cfb4136d46cdcbb/Django-2.2.2-py3-none-any.whl
Collecting sqlparse (from django)
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from django)
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2.2 pytz-2019.1 sqlparse-0.3.0

Затем необходимо создать новый проект:

(docker) django17@quasar:~/django17.beget.tech [0] $ django-admin.py startproject HelloDjango

И создать файл passenger_wsgi.py со следующим содержимым:

# -*- coding: utf-8 -*-
import os, sys
sys.path.insert(0, '<полный_путь_до_каталога_с_проектом>')
sys.path.insert(1, '<полный_путь_до_Django>')
os.environ['DJANGO_SETTINGS_MODULE'] = '<название_проекта>.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

В рассматриваемом примере passenger_wsgi.py следующий:

# -*- coding: utf-8 -*-
import os, sys
sys.path.insert(0, '/home/d/django17/django17.beget.tech/HelloDjango')
sys.path.insert(1, '/home/d/django17/.local/lib/python3.6/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'HelloDjango.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Если мы используем virtualenv, то содержимое должно быть следующим:

# -*- coding: utf-8 -*-
import os, sys
sys.path.insert(0, '/home/d/django17/django17.beget.tech/HelloDjango')
sys.path.insert(1, '/home/d/django17/django17.beget.tech/venv/lib/python3.6/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'HelloDjango.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Для Django версии 1.4 - 1.6 отличается синтаксис последних двух строк.

В этом случае файл passenger_wsgi.py будет выглядеть следующим образом:

# -*- coding: utf-8 -*-
import os, sys
sys.path.append('/home/d/django17/django17.beget.tech/HelloDjango')
sys.path.append('/home/d/django17/.local/lib/python2.7/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'HelloDjango.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Для последних версий Django также требуется явно задать домен, на котором работает сайт. Для этого нужно отредактировать список ALLOWED_HOSTS в файле <название_проекта>/<название_проекта>/settings.py. В нашем примере он будет выглядеть так:

ALLOWED_HOSTS = ['django17.beget.tech']

Для корректной отдачи статического контента средствами Nginx необходимо создать символьную ссылку public, указывающую на public_html:

(docker) django17@quasar:~/django17.beget.tech [0] $ ln -s public_html public

Затем нужно создать файл .htaccess и указать в нем путь до Python:

PassengerEnabled On
PassengerPython /usr/bin/python3.6

Если используется virtualenv, то содержимое будет следующим:

PassengerEnabled On
PassengerPython /home/d/django17/django17.beget.tech/venv/bin/python3.6

При использовании локально собранного Python содержимое может быть и таким:

PassengerEnabled On
PassengerPython /home/d/django17/.local/bin/python3.7

Внимание! Путь может отличаться в зависимости от используемой версии Python.

После завершения настройки окружения необходимо создать каталог tmp, где будет хранится файл restart.txt:

(docker) django17@quasar:~/django17.beget.tech [0] $ mkdir tmp; touch tmp/restart.txt

Для проверки работоспособности нужно открыть сайт в браузере:


Установка микрофреймворка Flask

Сначала необходимо перейти в виртуальное окружение сервера (Docker), подробнее можно ознакомится по ссылке Общие сведения по установке приложений (виртуальное окружение Docker):

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 4.1.5-3-beget-acl x86_64)

 * Documentation:  https://help.ubuntu.com/
(docker) deniatest@robin:~ [0] $

В рассматриваемом примере каталог сайта - flask, нужно перейти в этот каталог:

(docker) deniatest@robin:~/.beget/tmp/Python-3.4.3 [0] $ cd ~/flask/

Установка Flask происходит через пакетный менеджер pip:

(docker) deniatest@robin:~/flask [1] $ pip3 install flask --user --ignore-installed
Collecting flask
  Downloading https://files.pythonhosted.org/packages/9a/74/670ae9737d14114753b8c8fdf2e8bd212a05d3b361ab15b44937dfd40985/Flask-1.0.3-py2.py3-none-any.whl (92kB)
    100% |====================>| 92kB 2.3MB/s
Collecting Werkzeug>=0.14 (from flask)
  Using cached https://files.pythonhosted.org/packages/9f/57/92a497e38161ce40606c27a86759c6b92dd34fcdb33f64171ec559257c02/Werkzeug-0.15.4-py2.py3-none-any.whl
Collecting click>=5.1 (from flask)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
    100% |====================>| 81kB 8.4MB/s
Collecting Jinja2>=2.10 (from flask)
  Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl
Collecting itsdangerous>=0.24 (from flask)
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
  Using cached https://files.pythonhosted.org/packages/b2/5f/23e0023be6bb885d00ffbefad2942bc51a620328ee910f64abe5a8d18dd1/MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
Installing collected packages: Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
Successfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.4 click-7.0 flask-1.0.3 itsdangerous-1.1.0

Необходимо создать каталог с новым проектом HelloFlask и временный каталог tmp:

(docker) deniatest@robin:~/flask [0] $ mkdir HelloFlask tmp

Для корректной отдачи статического контента средствами Nginx создается симлинк на public_html:

deniatest@robin:~/flask [0] $ ln -s public_html public

После чего нужно создать файл .htaccess со следующим содержимым:

PassengerEnabled On
PassengerPython /usr/bin/python3

где во второй директиве PassengerPython указывается путь до интерпретатора Python. Если используется virtualenv или локально собранный Python, то /usr/bin/python3 необходимо заменить на соответствующий путь.

Далее нужно создать файл passenger_wsgi.py со следующим содержимым:

# -*- coding: utf-8 -*-
import sys, os
sys.path.append('/home/d/deniatest/flask/HelloFlask/') # указываем директорию с проектом
sys.path.append('/home/d/deniatest/.local/lib/python3.6/site-packages') # указываем директорию с библиотеками, куда поставили Flask
from HelloFlask import app as application # когда Flask стартует, он ищет application. Если не указать 'as application', сайт не заработает
from werkzeug.debug import DebuggedApplication # Опционально: подключение модуля отладки
application.wsgi_app = DebuggedApplication(application.wsgi_app, True) # Опционально: включение модуля отадки
application.debug = False  # Опционально: True/False устанавливается по необходимости в отладке

В каталоге проекта HelloFlask необходимо создать файл __init__.py со следующим содержимым:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello Flask!'

if __name__ == '__main__':
    app.run()

После чего в корневом каталоге сайта ~/flask необходимо выполнить следующую команду:

deniatest@robin:~/flask [0] $ touch tmp/restart.txt

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


Первоначальная установка микрофреймворка Bottle

Сначала необходимо перейти в виртуальное окружение сервера (Docker), подробнее можно ознакомится по ссылке Общие сведения по установке приложений (виртуальное окружение Docker).

После чего перейти в каталог сайта:

(docker) deniatest@robin:~ [0] $ cd bottle/

Bottle устанавливается через пакетный менеджер pip. Обращаем Ваше внимание, что в данной статье используется Python 3.6. При необходимости, можете установить на другую версию, соответственно поправив все пути и директивы:

(docker) deniatest@robin:~/bottle [0] $ pip3 install bottle --user --ignore-installed
Collecting bottle
  Downloading https://files.pythonhosted.org/packages/69/d1/efdd0a5584169cdf791d726264089ce5d96846a8978c44ac6e13ae234327/bottle-0.12.17-py3-none-any.whl (89kB)
    100% |====================>| 92kB 1.7MB/s
Installing collected packages: bottle
Successfully installed bottle-0.12.17

Затем нужно создать каталог с новым проектом HelloBottle и временный каталог tmp:

(docker) deniatest@robin:~/bottle [0] $ mkdir HelloBottle tmp

Для корректной отдачи статического контента средствами Nginx создается симлинк на public_html:

(docker) deniatest@robin:~/bottle [0] $ ln -s public_html public

Далее нужно создать файл .htaccess, общий вид которого:

PassengerEnabled On
PassengerPython /usr/bin/python3.6
SetEnv PYTHONPATH /home/первая_буква_логина_аккаунта/логин_аккаунта/.local/lib/python3.6/site-package

Вторая директива PassengerPython указывает путь до интерпретатора Python, третья директива SetEnv - путь к установленным модулям. Поскольку по умолчанию модули устанавливаются в каталог /usr/lib/python3.6 и /usr/local/lib/python3.6, необходимо переопределить этот параметр.

В рассматриваемом примере .htaccess получился следующим:

PassengerEnabled On
PassengerPython /usr/bin/python
SetEnv PYTHONPATH /home/d/deniatest/.local/lib/python3.6/site-packages

Общий вид файла passenger_wsgi.py:

# -*- coding: utf-8 -*-

import sys
import bottle
import os

# add your project directory to the sys.path
project_home = u'/home/первая_буква_логина_аккаунта/логин_аккаунта/сайт/название_проекта/'
if project_home not in sys.path:
    sys.path = [project_home] + sys.path

# make sure the default templates directory is known to Bottle
templates_dir = os.path.join(project_home, 'views/')
if templates_dir not in bottle.TEMPLATE_PATH:
    bottle.TEMPLATE_PATH.insert(0, templates_dir)

# import bottle application
from app import application

В рассматриваемом примере passenger_wsgi.py получился следующим:

# -*- coding: utf-8 -*-

import sys
import bottle
import os

# add your project directory to the sys.path
project_home = u'/home/d/deniatest/bottle/HelloBottle/'
if project_home not in sys.path:
    sys.path = [project_home] + sys.path

# make sure the default templates directory is known to Bottle
templates_dir = os.path.join(project_home, 'views/')
if templates_dir not in bottle.TEMPLATE_PATH:
    bottle.TEMPLATE_PATH.insert(0, templates_dir)

# import bottle application
from app import application

Затем необходимо создать файл app.py в каталоге проекта HelloBottle:

# -*- coding: utf-8 -*-

from bottle import default_app, route, run, debug

@route('/')
def default():
    return u'Hello Bottle!'

@route('/no')
def hello_world():
    return u'Hello ОТ - no -- Bottle!'

@route('/c')
def hello_world():
    return u'c Hello ОТ - -- Bottle!'

#debug(True)
application = default_app()

Для того чтобы Passenger переприменил конфиг, необходимо создать файл tmp/restart.txt:

deniatest@robin:~/bottle [0] $ touch tmp/restart.txt

Для проверки работоспособности нужно открыть сайт в браузере:

Установка web2py

Web2py — фреймворк с открытым исходным кодом для разработки веб-приложений, написанный на языке программирования Python. Web2py призван сократить рутинные процессы веб-разработки, такие как написание веб-форм с нуля, хотя разработчик может сам разработать её с нуля, если в этом возникнет необходимость.

В этой статье будет рассмотрена установка этого фреймворка на хостинг Beget. В качестве версии Python мы будем использовать установленную глобально 3.6.

Первое, что нужно сделать - подключиться в виртуальное окружение сервера (Docker) через протокол SSH. Подробнее о подключении описывается в статье Общие сведения по установке приложений (виртуальное окружение Docker).

Теперь мы в виртуальном окружении переместимся в директорию сайта, заранее созданного в разделе Сайты, в нашем случае - это web2py:

(docker) denia059@plasma:~ [0] $ cd web2py/
(docker) denia059@plasma:~/web2py [0] $

После склонируем сам фреймворк:

(docker) denia059@plasma:~/web2py [0] $ git clone https://github.com/web2py/web2py.git
Cloning into 'web2py'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 41336 (delta 25), reused 46 (delta 22), pack-reused 41267
Receiving objects: 100% (41336/41336), 40.51 MiB | 22.75 MiB/s, done.
Resolving deltas: 100% (26182/26182), done.

Переместим все файлы в текущую директорию командой:

(docker) denia059@plasma:~/web2py [0] $ mv web2py/* .
(docker) denia059@plasma:~/web2py [0] $

Скопируем в текущую директорию файл handlers/wsgihandler.py:

(docker) denia059@plasma:~/web2py [0] $ cp handlers/wsgihandler.py .
(docker) denia059@plasma:~/web2py [0] $

Сделаем симлинк passenger_wsgi.py на файл wsgihandler.py:

(docker) denia059@plasma:~/web2py [0] $ ln -s wsgihandler.py passenger_wsgi.py
(docker) denia059@plasma:~/web2py [0] $

Добавим несколько директив в файл .htaccess:

PassengerEnabled On
PassengerPython /usr/bin/python3.6
SetEnv PYTHONPATH $HOME/.local/lib/python3.6/site-packages

Для работы web2py нужно поставить библиотеки pyDAL и yatl:

(docker) denia059@plasma:~/web2py [0] $ pip3 install pyDAL yatl --user --ignore-installed
Collecting pyDAL
  Downloading https://files.pythonhosted.org/packages/65/1e/ad330385bf45ee280cd2d33ed086e11224658863ab851f9d1a8421656424/pydal-19.5.11.tar.gz (390kB)
    100% |====================>| 399kB 2.6MB/s
Building wheels for collected packages: pyDAL
  Running setup.py bdist_wheel for pyDAL ... done
  Stored in directory: /home/r/r91115vb/.cache/pip/wheels/7e/1f/ba/e04f60cf1a3dff4ba20c856a197edaebab63af014af8f91901
Successfully built pyDAL
Installing collected packages: pyDAL
Successfully installed pyDAL-19.5.11
Collecting yatl
  Downloading https://files.pythonhosted.org/packages/a7/a2/d4b38d0b550117b4af7f814542fcbd9a2fac26be100e6a57bb5c0998ed3a/yatl-1.0.7.tar.gz
Building wheels for collected packages: yatl
  Running setup.py bdist_wheel for yatl ... done
  Stored in directory: /home/r/r91115vb/.cache/pip/wheels/cc/c4/42/64347cd144fcbc1163f50a9f7a0abda9ebc9089f7b950b9741
Successfully built yatl
Installing collected packages: yatl
Successfully installed yatl-1.0.7

Для корректной отдачи статического контента средствами Nginx создается симлинк на public_html:

(docker) denia059@plasma:~/web2py [0] $ ln -s public public_html
(docker) denia059@plasma:~/web2py [0] $

Для того чтобы Passenger переприменил конфиг, необходимо создать файл tmp/restart.txt:

(docker) denia059@plasma:~/web2py [0] $ mkdir tmp; touch tmp/restart.txt
(docker) denia059@plasma:~/web2py [0] $

Теперь проверим в браузере. Вводим URL нашего сайта и видим стандартную страницу с установленным фреймворком:

Ссылка на административную панель фреймворка - http://site.ru/admin, в рассматриваемом примере - http://denia059.beget.tech/admin.

В документации web2py указано, что доступ к административной панели заблокирован. Чтобы разблокировать доступ, необходимо выполнить следующую команду:

denia059@plasma:~/web2py [0] $ python3.6 -c "from gluon.main import save_password; save_password(input('admin password: '),80)"

После чего ввести пароль:

admin password: qwerty

Проверка работоспособности сайта средствами браузера:

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





Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел "Помощь и поддержка".