.. _tutorial-setup: Шаг 2: Код для настройки приложения =================================== Сейчас, когда наша схема уже на месте, мы можем создать модуль приложения. Давайте назовём его flaskr.py. Мы разместим его в папке flaskr. Начнём с добавления импортирования необходимых нам модулей, а также с добавления раздела конфигурации. Для небольших приложений допустимо размещать конфигурацию прямо внутри модуля, что мы сейчас и сделаем. Однако, более прозрачным решением было бы создание отдельного файла `.ini` или `.py` и загрузка или импорт значений оттуда. Сперва мы добавим в `flaskr.py` импортирование модулей:: # все импорты import sqlite3 import os from flask import Flask, request, session, g, redirect, url_for, abort, \ render_template, flash # конфигурация DATABASE = '/tmp/flaskr.db' DEBUG = True SECRET_KEY = 'development key' USERNAME = 'admin' PASSWORD = 'default' Далее, мы должны создать наше текущее приложение и инициализировать его в помощью конфигурации из того же файла, т. е. flaskr.py:: # создаём наше маленькое приложение :) app = Flask(__name__) app.config.from_object(__name__) # Загружаем конфиг по умолчанию и переопределяем в конфигурации часть # значений через переменную окружения app.config.update(dict( DATABASE=os.path.join(app.root_path, 'flaskr.db'), DEBUG=True, SECRET_KEY='development key', USERNAME='admin', PASSWORD='default' )) app.config.from_envvar('FLASKR_SETTINGS', silent=True) Объект :class:`~flask.Config` работает подобно словарю, поэтому мы можем обновлять его с помощью новых значений. .. admonition:: Путь к базе данных Операционные системы знают концепцию текущего рабочего каталога для каждого из процессов. К несчастью, в случае веб-приложений, вы не можете отталкиваться от этого, так как у вас может быть более одного приложения в одном и том же процессе. По этой причине, для получения пути к приложения может быть использован атрибут ``app.root_path``. Если одновременно использовать модуль ``os.path``, можно легко найти все файлы. В этом примере мы поместили базу данных прямо рядом с приложением. Для реальных рабочих приложений вместо этого рекомендуется использовать :ref:`instance-folders`. Обычно, загрузка отдельного, определяемого через переменную окружения, конфигурационного файла является хорошей идеей. Flask позволяет вам импортировать множество конфигураций, используя при этом те установки, которые были определены в последнем из импортов. Это позволяет использовать при настройках конфигурации мощные возможности. Для достижения этого используется :meth:`~flask.Config.from_envvar`. app.config.from_envvar('FLASKR_SETTINGS', silent=True) Просто определите переменную окружения :envvar:`FLASKR_SETTINGS`, которая укажет, какой файл конфигурации необходимо загрузить. Опция silent просит Flask не ругаться, если вышеуказанная переменная окружения не установлена. В добавление к сказанному, вы можете использовать метод :meth:`~flask.Config.from_object` объекта конфигурации, указавему имя импортируемого модуля. Flask проинициализирует переменную из этого модуля. Заметим, что в любом случае будут учтены только имена переменных, заданные в верхнем регистре. ``SECRET_KEY`` нужен для обеспечения безопасности сессий на стороне клиента. Выбирайте этот ключ с умом, и настолько трудный для разгадывания и сложный, насколько это возможно. Флаг DEBUG включает или отключает интерактивный отладчик. *Никогда не оставляйте режим отладки активированным при реальном использовании системы*, потому что это позволит пользователям исполнять код на сервере! Добавим также метод, который позволяет простым способом соединиться с указанной базой данных. Он может быть использован для открытия соединения по запросу, а также из интерактивной командной оболочки Python или из скрипта. Это пригодится в дальнейшем. Мы создаём простое соединение с базой данных SQLite и далее просим его использовать для представления строк объект :class:`sqlite3.Row`. Это позволит нам рассматривать строки, как если бы они были словарями, а не кортежами. :: def connect_db(): """Соединяет с указанной базой данных.""" rv = sqlite3.connect(app.config['DATABASE']) rv.row_factory = sqlite3.Row return rv Наконец, мы просто добавляем строчку в конце файла, которая запускает сервер, если мы хотим запустить этот файл как отдельное приложение:: if __name__ == '__main__': app.run() Отвлекаясь на минутку, приведём способ, которым достигается запуск приложения без каких-либо проблем - это делается с помощью следующих команд:: python flaskr.py Вы увидите сообщение, которое сообщает вам о том, что сервер запущен, и адрес, по которому вы можете к нему получить доступ. Когда вы зайдёте с помощью своего браузера на сервер, вы получите ошибку 404 (страница не найдена), так как у нас пока нет ни одного представления (view). Однако, мы сфокусируемся на этом чуть позже. Для начала мы должны добиться, чтобы заработала база данных. .. admonition:: Сервер, доступный из внешнего мира Хотите, чтобы ваш сервер был публично доступным? Для получения дополнительной информации обратитесь к разделу :ref:`externally visible server `. Продолжение: :ref:`tutorial-dbcon`. `Оригинал этой страницы `_