Как я могу подключить свое фляжное приложение к моей базе данных SQLite3?

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

Итак, в моем коде Python я пытаюсь собрать данные из формы обратной связи с клиентом и сохранить их в базе данных.

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

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

Я смотрел учебные пособия по sqlite3, которые было легко понять и выполнить (намного проще для меня, чем MySQL), но я что-то упускаю, потому что он не подключается к моей базе данных.

мой код фляги python:

from flask import Flask, render_template, redirect, url_for, request, session, flash, g
from functools import wraps
import sqlite3

app = Flask(__name__)
app.secret_key = "random_character_generator" # this would be random or anything the developer wants
app.database = "gymdatabase.db"

conn = sqlite3.connect(app.database)
c = conn.cursor()

def connect_db():
    return sqlite3.connect(app.database)

@app.route('/')
def home():
    g.db = connect_db()
    cur = g.db.execute('select * from posts')
    posts = [dict(name=row[0], welcome=row[1], equipment=row[2], cleanliness=row[3], interaction=row[4], comments=row[5], contact=row[6]) for row in cur.fetchall()]
    g.db.close()
    return render_template('gym_index.html', posts=posts)

@app.route('/feedback', methods=['POST'])
def feedback():
    return render_template('gym_feedback.html')

@app.route('/process', methods=['GET', 'POST'])
def process():
    g.db = connect_db()
    name = request.form['name']
    welcome = request.form['welcome']
    equipment = request.form['equipment']
    cleanliness = request.form['cleanliness']
    interaction = request.form['interaction']
    comment = request.form['comment']
    contact = request.form['yes_no']
    conn.commit()
    cur = g.db.execute(select * from posts)
    posts = [dict(name=row[0], welcome=row[1], equipment=row[2], cleanliness=row[3], interaction=row[4], comments=row[5], contact=row[6]) for row in cur.fetchall()]
    g.db.close()
    return redirect(url_for('home', posts=posts))   

Когда я пытаюсь отправить форму обратной связи, я получаю: sqlite3.ProgrammingError: объекты SQLite, созданные в потоке, могут использоваться только в этом же потоке.

Я могу загрузить файл html по запросу; Я не слишком уверен, есть ли у меня место для этого вместе с моим файлом python.

🤔 А знаете ли вы, что...
С Python можно создавать настольные приложения с использованием библиотеки Tkinter.


1
776
1

Ответ:

Я думаю, что это связано с вашей строкой conn.commit() в вашей функции process(). Вы объявляете conn = sqlite3.connect(app.database) при первом запуске Flask, но каждая функция, определенная с помощью декоратора функций @app.route(...), вызывается в другом потоке в ответ на HTTP-запросы (как определено в вышеупомянутом декораторе функций). Вы, вероятно, хотите сделать что-то вроде этого:

@app.route('/process', methods=['GET', 'POST'])
def process():
    ...
    db = connect_db()
    cur = db.cursor()
    cur.execute("select * from posts")
    results = cur.fetchall()
    ...

Вы можете увидеть эту ссылку для получения дополнительной документации: https://docs.python.org/2/library/sqlite3.html

Я могу отредактировать свой ответ, если вы предоставите больше информации о том, где ваш код не работает.