Тестовое приложение на 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