python - Flask Web 应用程序 - 努力将用户提交的信息导入 MySQL 数据库
问题描述
我正在使用 Flask 构建一个基本的 Web 应用程序,并尝试将信息导入本地托管的 MySQL 数据库。目前,我有一个包含单列(电子邮件)的表,我正在尝试捕获在应用程序的注册页面上提交的信息。
我觉得我快到了,但由于以下错误而无法让它工作:
[2020-10-04 16:58:16,448] ERROR in app: Exception on /register [POST]
Traceback (most recent call last):
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\MySQLdb\cursors.py", line 204, in execute
query = query % args
TypeError: not all arguments converted during bytes formatting
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\tjmce\Desktop\Final Project\app.py", line 137, in register
cur.execute("INSERT INTO users (email) VALUES (%s)", email)
File "c:\users\tjmce\appdata\local\programs\python\python38-32\lib\site-packages\MySQLdb\cursors.py", line 206, in execute
raise ProgrammingError(str(m))
MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting
当然,我试过在网上搜索,虽然我发现了一些非常相似的例子,但提供的解决方案似乎都不适合我。
这是我的应用程序的完整代码(不包括 HTML 页面模板和一些本地导入的文件)。如果有人能帮助我了解这里出了什么问题,我将不胜感激。
import os
from datetime import datetime, timedelta
from flask import Flask, flash, jsonify, redirect, render_template, request, session
from flask_session import Session
from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
from werkzeug.security import check_password_hash, generate_password_hash
from tempfile import mkdtemp
from support import apology, login_required
from flask_mysqldb import MySQL
# Configure application
app = Flask(__name__)
# Ensure templates are auto-reloaded
app.config["TEMPLATES_AUTO_RELOAD"] = True
# Ensure responses aren't cached
@app.after_request
def after_request(response):
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Expires"] = 0
response.headers["Pragma"] = "no-cache"
return response
# Custom filter
#app.jinja_env.filters["usd"] = usd
# Configure session to use filesystem (instead of signed cookies)
app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
# MySQL Configuration
app.config['MYSQL_HOST'] = "localhost"
app.config['MYSQL_USER'] = "root"
app.config['MYSQL_PASSWORD'] = ""
app.config['MYSQL_DB'] = "test"
mysql = MySQL(app)
@app.route("/register", methods=["GET", "POST"])
def register():
"""Register user"""
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Ensure username was submitted
if not request.form.get("email"):
return apology("must provide email", 403)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 403)
# Ensure confirmation password was submitted
elif not request.form.get("confirm"):
return apology("must confirm password", 403)
# Ensure password confirmation matches
elif (request.form.get("confirm") != request.form.get("password")):
return apology("confirmation password must match", 403)
# Store email in a variable
email = request.form.get("email")
# Store password in a variable
password = request.form.get("password")
# Store first name in a variable
firstname = request.form.get("firstname")
# Store last name in a variable
lastname = request.form.get("lastname")
# Hash the password
hashedpassword = generate_password_hash(password=password, method='pbkdf2:sha256', salt_length=8)
# Create a cursor
cur = mysql.connection.cursor()
# Insert email into database
cur.execute("INSERT INTO users (email) VALUES (%s)", email)
mysql.connection.commit()
cur.close()
# Pass the username and password via post to the register template
return render_template("registered.html", email=email, password=password)
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("register.html")
谢谢你。
解决方案
python 和连接器不接受单个参数。所以使用
# Insert email into database
cur.execute("INSERT INTO users (email) VALUES (%s)", (email,))
mysql.connection.commit()
cur.close()
推荐阅读
- java - 如果对象的一个值重复,则从 ArrayList 中删除
- pandas - 如何按升序绘制滚动平均值
- javascript - ReactDOM.render 不会在道具更改时更新组件
- php - 如何通过ajax将radio的值传递给php
- vim - Vim 中的特定键映射
- apollo - 查询适用于 useQuery 钩子,但不适用于 ApolloClient 实例
- postgresql - postgresql:带有符号引用的转储数据库?
- python - 使用更大的 spacy 模型加速测试运行的好方法是什么?
- node.js - mongo db数据写入问题 - oauth
- python - 将多个调用分配给单个变量,否则对性能无关紧要