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

Привет, я пытаюсь создать форму обратной связи с клиентом;Мне удалось создать нужные мне страницы, но у меня возникли трудности с подключением моего приложения к базе данных 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.

1 Ответ

0 голосов
/ 27 января 2019

Я думаю, что это связано с вашей строкой 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

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

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