Тестовое приложение на Python Flask
-
Установите необходимые пакеты: JSON-процессор jq, Git-клиент, менеджер пакетов PIP, систему управления виртуальными средами virtualenv, набор заголовочных файлов для Python C API и веб-сервер Nginx:
sudo apt-get --yes install jq git python-pip virtualenv python-dev nginx-full
-
Создайте директорию, в которой будет находиться приложение. Также сделайте пользователя, от имени которого вы подключились к ВМ, владельцем директории:
sudo mkdir /srv/test-app sudo chown -R $USER /srv/test-app
-
Перейдите в директорию и создайте в ней виртуальное окружение
virtualenv
:cd /srv/test-app virtualenv test-venv
-
Запустите виртуальное окружение:
. test-venv/bin/activate
-
Установите в виртуальное окружение фреймворк Flask и веб-сервер uWSGI:
pip install flask uwsgi
-
Деактивируйте виртуальное окружение:
deactivate
-
Создайте в директории
/srv/test-app
файлapi.py
:touch api.py
-
Откройте файл
api.py
любым текстовым редактором и скопируйте в него код на языке Python, который:- Принимает на вход текстовую строку в параметре
text
. - Записывает каждое слово из переданной строки наоборот.
-
Возвращает ответ:
- В формате JSON, если клиентское приложение может принимать JSON.
- Обычный текст, если клиентское приложение не может принять JSON.
- Принимает на вход текстовую строку в параметре
# api.py
import json
from flask import Flask, request, make_response as response
app = Flask(__name__)
@app.route("/")
def index():
text = request.args.get('text')
json_type = 'application/json'
json_accepted = json_type in request.headers.get('Accept', '')
if text:
words = text.split()
reversed_words = [word[::-1] for word in words]
if json_accepted:
res = response(json.dumps({'text': reversed_words}), 200)
else:
res = response(' '.join(reversed_words), 200)
else:
res = response('text not found', 501)
res.headers['Content-Type'] = json_type if json_accepted else 'text/plain'
return res
-
Создайте в директории
/srv/test-app
файлwsgi.py
:touch wsgi.py
-
Откройте файл
wsgi.py
любым текстовым редактором и скопируйте в него код, запускающий тестовое приложение:
# wsgi.py
from api import app
if __name__ == "__main__":
app.run()
-
Создайте в директории
/srv/test-app
файлtest-app.ini
:touch test-app.ini
-
Откройте файл
test-app.ini
любым текстовым редактором и скопируйте в него конфигурацию сервера uWSGI:
# test-app.ini
[uwsgi]
module = wsgi:app
master = true
processes = 1
socket = test-app.sock
chmod-socket = 660
vacuum = true
die-on-term = true
- Назначьте пользователя
www-data
владельцем директории/srv/test-app
и файлов в ней:
sudo chown -R www-data:www-data /srv/test-app
- Подготовьте сервис для запуска вашего uWSGI-сервера. Для этого приведите файл
/etc/systemd/system/test-app.service
к следующему виду:
# /etc/systemd/system/test-app.service
[Unit]
Description=uWSGI instance to serve test API
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/srv/test-app
Environment="PATH=/srv/test-app/test-venv/bin"
ExecStart=/srv/test-app/test-venv/bin/uwsgi --ini test-app.ini
[Install]
WantedBy=multi-user.target
- Укажите настройки нового виртуального сервера в конфигурации Nginx, приведя файл
/etc/nginx/sites-available/test-app.conf
к следующему виду:
# /etc/nginx/sites-available/test-app.conf
server {
#server_name test-app.yandex www.test-app.yandex;
listen 80;
location /test/ {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /test;
uwsgi_modifier1 30;
uwsgi_pass unix:/srv/test-app/test-app.sock;
}
}
-
Создайте символическую ссылку, указывающую на конфигурационный файл Nginx
test-app.conf
:sudo ln -s /etc/nginx/sites-available/test-app.conf /etc/nginx/sites-enabled/
-
Удалите символическую ссылку, указывающую на конфигурацию Nginx по умолчанию:
sudo unlink /etc/nginx/sites-enabled/default
-
Добавьте сервис в список автозапуска системы:
sudo systemctl enable test-app.service
Проверьте работу тестового приложения test-app
Чтобы убедиться, что тестовое приложение работает, а веб-сервер настроен верно, выполните простой запрос.
-
В строке браузера введите URL для проверки работы веб-сервера и приложения:
http://<публичный_IP-адрес_ВМ>/test/?text=hello_world