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