Uczę się Flaska, zrobiłem ćwiczenie z książki, sprawdziłem - wszystko dokładnie tak samo. Niestety, kiedy przesyłam formularz, a wyniki chcę zapisać do bazy danych, Flask pokazuje błąd o następującej treści:
mysql.connector.errors.ProgrammingError: Failed processing format-parameters; Python 'set' cannot be converted to a MySQL type
Błąd jest o tyle dziwny, że do funkcji nie przekazuje zbioru.
Program wczytuje dane od użytkownika przez formularz, a następnie wyświetla litery, które są wspólne dla obu ciągów.
Kod programu:
from flask import *
app = Flask(__name__)
def write_to_log(req:"flask_request", res:str) -> None:
dbconfig = {
"host": "127.0.0.1",
"database": "vsearchlogDB",
"user": "vsearch",
"password": "vsearchpasswd",
}
import mysql.connector
conn = mysql.connector.connect(**dbconfig)
cursor = conn.cursor()
_SQL = """insert into log
(phrase, letters, ip, browser_string, results)
values
(%s, %s, %s, %s, %s)"""
cursor.execute(_SQL, (req.form['phrase'],
req.form['letters'],
req.remote_addr,
req.user_agent.browser,
res))
conn.commit()
cursor.close()
conn.close()
@app.route("/")
def entery_page() -> "html":
return render_template('entry.html', the_title="Witamy na stronie internetowej Search Letters!")
@app.route("/search", methods=['POST'])
def do_search() -> str:
phrase = request.form['phrase']
letters = request.form['letters']
title = "Oto Twoje wyniki: "
results = set(phrase).intersection(set(letters))
write_to_log(request, results)
return render_template(
"results.html",
the_title=title,
the_phrase=phrase,
the_letters=letters,
the_results=results)
@app.route("/viewlog")
def vlog() -> 'html':
contents = []
with open("vsearch.log") as log:
for line in log:
contents.append([])
for item in line.split("|"):
contents[-1].append(escape(item))
table_headers = ("Dane z formularza", "Adres klienta", "Agent użytkownika", "Wyniki")
return render_template('viewlog.html', the_title="Logi w ładnej postaci.", the_row_titles=table_headers, the_data=contents)
# Run app
if __name__ == '__main__':
app.run(port=80, debug=True)
else:
app.run(port=80, debug=False)
Kod funkcji, w której występuje problem:
def write_to_log(req:"flask_request", res:str) -> None:
dbconfig = {
"host": "127.0.0.1",
"database": "vsearchlogDB",
"user": "vsearch",
"password": "vsearchpasswd",
}
import mysql.connector
conn = mysql.connector.connect(**dbconfig)
cursor = conn.cursor()
_SQL = """insert into log
(phrase, letters, ip, browser_string, results)
values
(%s, %s, %s, %s, %s)"""
cursor.execute(_SQL, (req.form['phrase'],
req.form['letters'],
req.remote_addr,
req.user_agent.browser,
res))
conn.commit()
cursor.close()
conn.close()
Fragment kodu, gdzie prawdopodobnie jest błąd:
_SQL = """insert into log
(phrase, letters, ip, browser_string, results)
values
(%s, %s, %s, %s, %s)"""
cursor.execute(_SQL, (req.form['phrase'],
req.form['letters'],
req.remote_addr,
req.user_agent.browser,
res))
conn.commit()
Dziękuję za wszystkie odpowiedzi!