English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite Flask

Python имеет встроенную поддержку SQlite. Модуль SQlite3 включен в дистрибутив Python. В этой главе мы увидим, как приложение Flask взаимодействует с SQLite.

Создание SQLite базы данных ‘database.db’и в ней создается таблица student.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
import sqlite3
 conn = sqlite3.connect('database.db')
 print "База данных открыта успешно";
 conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)')
 print "Таблица создана успешно";
 conn.close()

У приложения Flask три функции视图.

Функция new_student() привязана к правилу URL ('/addnew'). Она отображает HTML-файл с формой информации о студенте.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
@app.route('/enternew')
 def new_student():
     return render_template('student.html')

HTML-скрипт файла 'student.html' следующий -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Пример Flask</title>
 </head>
    <body>
     <form action="{{ url_for('addrec') }}" method="POST">
          <h3>Информация о студенте</h3>
          Имя<br>
          <input type="text" name="nm"/></br>
          Адрес<br>
          <textarea name="add"/><br>
          Город<br>
          <input type="text" name="city"/><br>
          Почтовый индекс<br>
          <input type="text" name="pin"/><br>
          <input type="submit" value="Подтвердить"/><br>
       </form>
    </body>
 </html>

Как видно, данные из формы отправляются на URL => ‘/addrec’, который связан с функцией addrec().

Функция addrec() через метод POST извлекает данные из формы и вставляет их в таблицу студентов. Соответствующие сообщения о succès или ошибке в операции отображаются на ‘result.html’.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
@app.route('/addrec', methods = ['POST', 'GET'])
 def addrec():
     if request.method == 'POST':
        try:
           nm = request.form['nm']
           addr = request.form['add']
           city = request.form['city']
           pin = request.form['pin']
           with sql.connect("database.db") as con:
              cur = con.cursor()
              cur.execute("INSERT INTO students (name, addr, city, pin) 
                VALUES (?, ?, ?, ?)",(nm, addr, city, pin)
              con.commit()
              msg = "Record successfully added"
        except:
           con.rollback()
           msg = "error in insert operation"
        finally:
           return render_template("result.html", msg = msg)
           con.close()

result.html HTML скрипт содержит экранизированные строки для отображения результата операции {{ msg }}.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Пример Flask</title>
 </head>
    <body>
       Результат операции: {{ msg }}
       <h2><a href="/">Вернуться на главную страницу</a></h2>
    </body>
 </html>

Этот приложение содержит другую функцию list() представленной URL => ‘/list’. Эта функция наполняет ‘строки’ MultiDict объектом, содержащим все записи из таблицы студентов. Этот объект передается шаблону list.html.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
@app.route('/list')
 def list():
     con = sql.connect("database.db")
     con.row_factory = sql.Row
     cur = con.cursor()
     cur.execute('select * from students')
     rows = cur.fetchall(); 
     return render_template('list.html', rows=rows)

Этот файл list.html является шаблоном, который итерирует через набор строк и представляет данные в таблице HTML.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Пример Flask</title>
 </head>
    <body>
       <table border="1">
          <thead>
             <td>Изменить имя</td>
             <td>Адрес</td>
             <td>Город</td>
             <td>Кодирование</td>
          </thead>
          {% for row in rows %}
             <tr>
                <td>{{row['name']}}</td>
                <td>{{row['addr']}}</td>
                <td>{{row['city']}}</td>
                <td>{{row['pin']}}</td> 
             </tr>
          {% endfor %}
       </table>
       <a href="/">Вернуться на главную страницу</a>
    </body>
 </html>

В конце, правило URL => ‘/’ представляет ‘home.html’ в качестве входной точки приложения.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
@app.route('/')
 def home():
     return render_template('home.html')

Это полная кодовая база приложения Flask-SQLite.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
from flask import Flask, render_template, request
 import sqlite3 as sql
 import sqlite3
 app = Flask(__name__)
 @app.route('/')
 def home():
     return render_template('home.html')
 @app.route('/enternew')
 def new_student():
     return render_template('student.html')
 @app.route('/addrec', methods = ['POST', 'GET'])
 def addrec():
     if request.method == 'POST':
        try:
           nm = request.form['nm']
           addr = request.form['add']
           city = request.form['city']
           pin = request.form['pin']
           with sql.connect("database.db") as con:
              cur = con.cursor()
              cur.execute("INSERT INTO students (name,addr,city,pin) VALUES (?, ?, ?, ?)", (nm, addr, city, pin))
              con.commit()
              msg = "Record successfully added"
        except:
           con.rollback()
           msg = "error in insert operation"
        finally:
           return render_template("result.html", msg = msg)
           con.close()
 @app.route('/list')
 def list():
     con = sql.connect("database.db")
     con.row_factory = sql.Row
     cur = con.cursor()
     cur.execute('select * from students')
     rows = cur.fetchall();
     return render_template('list.html', rows=rows)
 @app.route('/init')
 def init():
     conn = sqlite3.connect('database.db')
     print('Successfully opened database')
     conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)')
     print('Таблица создана успешно')
     conn.close()
     return None
 if __name__ == '__main__':
     app.run(debug=True)

Запустите этот скрипт из Python shell и запустите сервер разработки. Посетите: http://localhost:5000/ В браузере будет отображен такой простой меню -

Нажать Добавить информацию о студенте Ссылка откроет форму ввода информации о студенте.

Заполните форму и отправьте. Базовые функции вставят эту запись в таблицу студентов.

Вернуться на домашнюю страницу и щелкнуть ссылку «Показать список», чтобы отобразить таблицу образцов данных.