DevGang
Авторизоваться

Автоматическая загрузка переменных окружения во Flask

С появлением интерфейса командной строки Flask, одна из самых раздражающих вещей, которые вы должны делать во время разработки, - это устанавливать переменные среды каждый раз, когда вы работаете над своим приложением, а именно FLASK_ENV и FLASK_APP. Но, у Flask есть способ справиться с этими вещами так, чтобы сделать это только один раз. И с помощью той же функциональности вы также можете добавить другие переменные окружения для вашего проекта. В этой статье я покажу вам, как использовать python-dotenv для загрузки переменных окружения, готовых к работе при каждом запуске приложения.

Единственный пакет, который заставляет все это работать - это python-dotenv

Что мы будем строить

Я собираюсь продемонстрировать, как это работает, через очень простое приложение Flask.

Давайте начнем с создания каталогов и пустых файлов, которые нам понадобятся. Вот так будет выглядеть наш каталог проекта:

demo/__init__.py
demo/settings.py
.env
.flaskenv
run.py

Это приложение не будет делать ничего особенного. Оно просто покажет нам, какие значения конфигурации у нас есть.

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

Для начала в командной строке создайте новую виртуальную среду и установите flask и python-dotenv. Я использую pipenv, так что я могу сделать все это за один шаг:

pipenv install flask python-dotenv
pipenv shell

Затем в demo/__ init__.py нам нужно будет создать основы приложения Flask, что означает импорт Flask, создание фабричной функции приложения (create_app) и создание экземпляра Flask. Вот код, чтобы сделать это.

demo/__init__.py
from flask import Flask 

def create_app():
    app = Flask(__name__)

    return app

Если вы уже работали с Flask, то вы точно знаете, как это работает.

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

demo/__init__.py
from flask import Flask 

def create_app():
    app = Flask(__name__)

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

Hey There!

' return app

Добавление переменой окружения FLASK_APP

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

flask run

Но когда мы выполним эту команду, мы получаем ошибку!

Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

Это распространенная ошибка. Обычно, чтобы это исправить, мы экспортируем переменную окружения FLASK_APP, которая будет равна имени каталога нашего приложения, например:

export FLASK_APP=demo

Но поскольку мы используем python-dotenv и хотим избежать неудобств, связанных с использованием командной строки, мы получим эту загрузку автоматически, поместив ее в один из наших дот файлов.

У нас есть два дот файла: .env и .flaskenv. Мы хотим использовать .flaskenv для любых команд конфигурации Flask CLI и использовать .env для конфигурации нашего приложения.

Мы поместим нашу переменную среды FLASK_APP в файл .flaskenv.

.flaskenv
FLASK_APP=demo

Теперь, когда мы добавили эту строку, давайте попробуем снова запустить приложение.

flask run

И откроем в браузере localhost:5000 или 127.0.0.1:5000, чтобы увидеть результат.

Обратите внимание на сообщение, которое появляется в командной строке, в котором говорится, что мы в режиме отладки.

Теперь, если мы прекратим работу над этим проектом и вернемся позже, все, что нам нужно сделать, - это запустить Flask и приложение запустится без необходимости повторного указания своего местоположения.

Параметры Flask CLI

Допустим, мы хотим изменить некоторые другие параметры Flask CLI, мы можем поместить их в наш файл .flaskenv.

Вот несколько вариантов:

  1. FLASK_ENV - контролирует окружающую среду.
  2. FLASK_DEBUG - включает режим отладки.
  3. FLASK_RUN_EXTRA_FILES - Список файлов, которые будут просматриваться перегрузчиком в дополнение к модулям Python.
  4. FLASK_RUN_HOST - хост, с которым вы хотите связать свое приложение.
  5. FLASK_RUN_PORT - Порт, который вы хотите использовать.
  6. FLASK_RUN_CERT - файл сертификата, чтобы ваше приложение могло работать с HTTPS.
  7. FLASK_RUN_KEY - ключевой файл для вашего сертификата.

Я думаю, что наиболее распространенными из них являются FLASK_ENV, FLASK_RUN_PORT и FLASK_RUN_EXTRA_FILES, поэтому я создам примеры с ними здесь.

Давайте начнем с FLASK_ENV. По умолчанию это «production», которое не делает ничего заметного. Суть среды в том, что вы можете решить, какие действия предпринять в приложении, в зависимости от среды. Например, вы можете сделать что-то вроде создания библиотеки Sentry для регистрации ошибок, когда вы в production, а не в development.

Если вы измените свой FLASK_ENV на development, самое большое изменение, которое вы увидите, это то, что reloader начинает работать, и ваше приложение переводится в режим отладки. Итак, давайте установим это значение в нашем файле .flaskenv.

.flaskenv
FLASK_APP=demo
FLASK_ENV=development

Давайте остановим сервер и снова запустим наше приложение.

flask run

Обратите внимание, как сообщение меняется сейчас.

Давайте добавим еще один для порта.

.flaskenv
FLASK_APP=demo
FLASK_ENV=development
FLASK_RUN_PORT=8080

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

Что если мы не хотим останавливать и перезапускать наше приложение, когда мы изменяем не-py-файлы в нашем проекте? Мы можем использовать FLASK_RUN_EXTRA_FILES для этого. Например, чтобы посмотреть файлы с именами config.yml и README.md

FLASK_RUN_EXTRA_FILES=config.yml:README.md

(Если вы используете Windows, вам нужно использовать точку с запятой (;) вместо двоеточия (:) для разделения нескольких файлов)

Добавляем .env

Теперь, когда мы поработали с .flaskenv, давайте перейдем к добавлению переменных в файл .env. Мы будем использовать их в нашем приложении.

Одно из преимуществ наличия .env для хранения переменных среды нашего приложения заключается в том, что мы можем легко иметь несколько версий файла для каждого места, где мы запускаем наше приложение. Например, у нас может быть один для нашей локальной машины, один для промежуточной среды, один для production и т.д.

Давайте добавим два:

.env
SECRET_KEY=topsecretkey
API_KEY=donotsharethisapikeywithanyone

В отличие от значений, добавленных перед FLASK_ в нашем файле .flaskenv, переменные в .env не предназначены для автоматической загрузки в CLI. Вместо этого нам нужно загрузить их в наше приложение. Для этого мы будем использовать файл settings.py.

Внутри файла settings.py давайте импортируем среду из ОС, чтобы у нас был доступ к переменным среды.

demo/settings.py
from os import environ 

Далее нам нужно присвоить эти переменные окружения переменным Python, а затем мы загрузим их в наше приложение.

demo/settings.py
from os import environ 

SECRET_KEY = environ.get('SECRET_KEY')
API_KEY = environ.get('API_KEY')

Далее, давайте добавим конфигурацию из этого файла в наш __init__.py.

demo/__init__.py
from flask import Flask 

def create_app():
    app = Flask(__name__)

    app.config.from_pyfile('settings.py')

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

Hey There!

' return app

Теперь наши переменные окружения готовы к использованию. В случае SECRET_KEY, обычно некоторые расширения Flask, которые мы используем, подхватывают это и используют его автоматически. Для API_KEY нам нужно использовать это непосредственно в нашем коде.

В нашем коде мы просто отобразим API_KEY на нашем маршруте.

demo/__init__.py
from flask import Flask 

def create_app():
    app = Flask(__name__)

    app.config.from_pyfile('settings.py')

    @app.route('/')
    def index():
        return f'API_KEY = { app.config.get("API_KEY") }'

    return app

Работа в production

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

Если вы хотите увидеть эту работу, вы можете установить gunicorn, чтобы вам не приходилось использовать сервер разработки для Flask.

pipenv install gunicorn

Нам нужно создать файл, в котором gunicorn сможет найти объект приложения. Для этого мы создадим run.py. Давайте начнем со стандартного кода, который не загружает переменные среды, который состоит всего из двух строк.

run.py
from demo import create_app

app = create_app()
gunicorn run:app

Это должно работать на порту 8000 по умолчанию. Если вы перейдете в браузер, вы увидите, что значением API_KEY является None.

Это потому, что переменные окружения больше не загружаются для нас. Чтобы загрузить их, нам нужно использовать функцию load_dotenv из python-dotenv. Нам нужно добавить еще две строки кода:

run.py
from demo import create_app
from dotenv import load_dotenv

load_dotenv('.env') #the path to your .env file (or any other file of environment variables you want to load)

app = create_app()

Теперь, если мы снова запустим сервер с gunicorn, мы увидим наше значение API_KEY.

Источник:

#Flask #Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу