首页 > 解决方案 > 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")

谢谢你。

标签: pythonmysqlflask

解决方案


python 和连接器不接受单个参数。所以使用

    # Insert email into database
    cur.execute("INSERT INTO users (email) VALUES (%s)", (email,))
    mysql.connection.commit()
    cur.close()

推荐阅读