Подключение базы данных SQLite к приложению Flask через SQLAlchemy

Введение

В этом руководстве я объясню, как вы можете подключить базу данных к приложению Flask с помощью SQLAlchemy. В одной из моих предыдущих статей я описал, как начать разработку приложений с помощью Flask. Так что эту статью можно считать ее расширенной версией. Потому что после этого урока вы сможете добавить базу данных в свое приложение. Если вы пропустили мою предыдущую статью, пожалуйста, перейдите по ссылке ниже.



Начните с базового приложения Flask

В этой статье я собираюсь установить необходимые пакеты в виртуальной среде. Вы можете легко активировать виртуальную среду для своего приложения с помощью приведенных ниже команд [Я настоятельно рекомендую вам обратиться к приведенной выше статье, прежде чем настраивать среду разработки для этого руководства].

$ virtualenv env
$ source env/bin/activate
Once you activate the virtual environment, you can install flask in it.
$ pip install flask

Затем мы можем настроить наше приложение фляги с помощью основных файлов конфигурации, как показано ниже.

Теперь все наши файлы конфигурации готовы; затем мы можем начать подключать базу данных к нашему фляжному приложению.

Создание базы данных

Давайте установим SQLAlchemy в виртуальную среду, используя следующую команду.

$ pip install Flask-SQLAlchemy

Затем мы можем импортировать SQLAlchemy в наш файл app.py и начать создавать базу данных. Для этого руководства я использую базу данных SQLite3, и конфигурации будут следующими.

from flask_sqlalchemy import SQLAlchemy

# database
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///db.sqlite3’
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False
db = SQLAlchemy(app)

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

class User(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(20), unique=True, nullable=False)
  email = db.Column(db.String(120), unique=True, nullable=False)
  password = db.Column(db.String(60), nullable=False)
  date_registered = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)

Настройка маршрутов регистрации и входа

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

Перед настройкой этих маршрутов обязательно импортируйте request, redirect, flash, url_for пакеты в ваш app.py.

Инициализация базы данных и отображение зарегистрированных пользователей на домашней странице

В SQLAlchemy мы можем инициализировать базу данных с помощью следующей команды. Мы можем настроить эту команду в маршруте, чтобы после перехода на домашнюю страницу она автоматически инициализировала нашу базу данных и была готова хранить записи.

db.create_all()

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

User.query.all()
# here 'User' is our model name (eg: class User())

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

@app.route('/')
def home():
  db.create_all()
  return render_template('home.html', title='Home', users=User.query.all())

После этого нам нужно изменить наш файл конфигурации home.html, чтобы отобразить информацию о пользователях. Я использую для этого команды наследования шаблонов Jinja2 следующим образом.

{% for user in users %}
<p>
  {{ user.id }}<br />
  {{ user.username}} <br />
  {{ user.email }}<br />
  {{ user.password }}<br />
  {{ user.date_registered }}
</p>
{% endfor %}

Добавление сообщений об успешной регистрации пользователя и логировании

Я изменил файлы конфигурации home.html и login.html, чтобы отображать сообщения о регистрации пользователя и ведении журнала следующим образом. Я добавил одну и ту же команду ниже в два файла конфигурации.

{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    {% for category, message in messages %}
      <div class="alert alert-{{ category }}"> {{ message }}</div>
    {% endfor %}
  {% endif %}
{% endwith %}

Проверка

В этом фляжном приложении нам нужна пара проверок, чтобы убедиться, что мы не получаем ошибок при запуске приложения.

Итак, первая проверка заключается в том, что при регистрации пользователя он/она должен ввести один и тот же пароль для полей password и confirm password.

Давайте добавим эту проверку в наш файл конфигурации register.html.

<script>
var password = document.getElementById("password"), confirm_password = document.getElementById("confirm_password");

function validatePassword(){
  if(password.value != confirm_password.value) {
    confirm_password.setCustomValidity("Passwords Don't Match");
  } else {
    confirm_password.setCustomValidity('');
  }
}
password.onchange = validatePassword;
confirm_password.onkeyup = validatePassword;
</script>

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

В следующем уроке я собираюсь проверить, пытается ли новый пользователь зарегистрироваться с существующим именем пользователя или адресом электронной почты; если это так, нам нужно избежать этой регистрации и сообщить пользователю выбрать другое имя пользователя или адрес электронной почты. Эта проверка довольно проста с WTForms, поэтому мы сосредоточимся на ней во второй части.

Спасибо, что прочитали!

Удачного программирования 👨🏻‍💻