База знаний

Инструкции и ответы на вопросы о хостинге, работе сайтов и приложений

Flask

Flask — бесплатный фреймворк для создания веб-приложений на языке программирования Python, использующий набор инструментов Werkzeug, а также шаблонизатор Jinja2. Относится к категории так называемых микрофреймворков — минималистичных каркасов веб-приложений, сознательно предоставляющих лишь базовые возможности. 

По умолчанию сервер обрабатывает PHP-скрипты. Для запуска Python-приложений, выберите uWSGI в качестве веб-сервера для домена в разделе «Сайты и домены» → «Управление сайтами» Панели управления. Чтобы установить и настроить фреймворк, подключитесь к серверу по SSH.

В uWSGI уже включены основные модули, но для запуска Flask требуются дополнительные. Чтобы устанавливать модули в рамках аккаунта, настройте виртуальное окружение для Python.

Создание и настройка виртуального окружения

Подключитесь по SSH и выполните команду:

[username@server ~]$ pip install virtualenv --user 

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

[username@server ~]$ virtualenv --system-site-packages python

Активируйте виртуальное окружение:

[username@server ~]$ source ~/python/bin/activate

Виртуальное окружение настроено.

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

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

(python) [username@server ~]$ pip install Flask

В отличие от другого популярного фреймворка Django, для Flask не нужно создавать отдельный проект. Чтобы создать простейшее приложение на Flask, перейдите в корневую директорию вашего сайта

(python) [username@server]$ cd domains/domain.ru/public_html/

и создайте основной файл вашего приложения — myapp.py. Это можно сделать с помощью файлового менеджера в Панели управления или воспользовавшись текстовым редактором vim:

(python) [username@server public_html]$ vim myapp.py

Наполните его следующим содержимым (пример скопирован с официального сайта проекта):

from flask import Flask
app = Flask(__name__)
# Раскомментировать для получения traceback
# app.debug = True

@app.route("/")
def hello():
   return "Hello World!"

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

Теперь создайте файл входа в приложение — site.wsgi с помощью файлового менеджера в Панели управления или с помощью vim:

(python) [username@server public_html]$ vim site.wsgi

Содержимое site.wsgi:

 import os, sys
activate_this = '/home/username/python/bin/activate_this.py'
with open(activate_this) as f:
exec(f.read(), {'__file__': activate_this})
sys.path.insert(0, os.path.join('/home/username/domains/domain.ru/public_html/'))
from myapp import app as application
if __name__ == "__main__":
 application.run() 

из-за особенностей работы mod_wsgi, который используется для обработки запросов к сайту на Python, необходимо указывать именно application.run(). В противном случае при обращении к сайту возникнет ошибка 404. Учитывайте это, если возникнет необходимость отредактировать site.wsgi.

Настройте выполнение скриптов на Python, добавив правила в файл .htaccess:

DirectoryIndex site.wsgi
Options +ExecCGI
AddHandler wsgi-script .wsgi
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L]

Перейдите на сайт в браузере. Если всё сделано верно, на сайте отобразится следующее:

Дополнительные особенности

Предыдущей инструкции будет достаточно для запуска простейшего приложения на Flask, однако воспользоваться возможностями шаблонизатора Jinja2 не удастся, и выводить HTML-код нужно будет средствами самого приложения, например:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
  return "<center><h1>HelloWorld</h1></center>
  <br/><h3>Hello Again!<h3>"

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

В большинстве случаев, когда приложение уже достаточно объёмное, подобный вывод страницы нежелателен: такой код сложно читать, поддерживать и обновлять. Решить это можно с помощью HTML-шаблонов.

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

(python) [username@server public_html]$ pip install flask-wikimediaui

Создайте директорию templates и перейдите в нее:

(python) [username@server public_html]$ mkdir templates

(python) [username@server public_html]$ cd templates

Первый шаблон — home.html — задаст содержимое домашней страницы. Создайте файл и наполните его содержимым:

{% extends "layout.html" %}
{% block content %}
 <div>
  <h1>Python Web Server</h1>
  <h2>Using Flask and Jinja2</h2>
 </div>
{% endblock %}

Второй файл — layout.html — станет шаблоном, задающим структуру всех html-страниц:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>{% block title %}Simple Flask App{% endblock %}</title>
  {% block head %}
  {% endblock %}
 </head>
 <body>
  {% block content %}{% endblock %}
 </body>
</html>

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

(python) [username@server templates]$ cd ..

и замените содержимое файла myapp.py, добавив в него путь к созданному шаблону:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def home():
return render_template('home.html')

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

При такой настройке в адресной строке отображается site.wsgi. Избавиться от него можно с помощью posixpath. Итоговый вид myapp.py:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
@app.route('/index')
def index():
return render_template('home.html')

import posixpath

def application(environ, start_response):
environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
if environ['SCRIPT_NAME'] == '/':
environ['SCRIPT_NAME'] = ''
 return app(environ, start_response) 

Если все настроено верно, при переходе на сайт отобразится страница:


Полезные ссылки

Если у вас возникли сложности в процессе установки фреймворка, обратитесь в нашу службу поддержки.


Была ли эта инструкция полезной?