Tou*_*sos 3 mysql mysql-python flask
我使用 Flask 创建了一个非常简单的 Web 应用程序,并且连接了一个 MySQL 数据库。仅供参考,我在 Windows 上使用 bash。
下面的函数将一个人注册到 Mysql 数据库中,它按预期工作。定义游标对象并将数据保存到 MySQL 中。
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
name = form.name.data
email = form.email.data
username = form.username.data
password = hash.encrypt(str(form.password.data))
# Create cursor
cur = mysql.connection.cursor()
cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)",
[name, email, username, password])
# commit to db
mysql.connection.commit()
# close connection
cur.close()
flash('You are now registered and can log in', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
Run Code Online (Sandbox Code Playgroud)
当我想从 mysql 加载数据时,问题就开始了:
def data():
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM users")
mysql.connection.commit()
cur.close()
data()
Run Code Online (Sandbox Code Playgroud)
我收到错误:
文件“app.py”,第 23 行,数据中的 cur = mysql.connection.cursor() AttributeError: 'NoneType' object has no attribute 'cursor'
正如@Martijn Pieters 指出的那样,这意味着我无法连接到 mysql 数据库。问题是,为什么flask 连接第一个函数没有问题,而第二个函数有问题?
以下是我用于复制的导入:
from flask import Flask, render_template, flash, request, redirect, url_for, session, logging, url_for
from data import Articles
from flask_mysqldb import MySQL
from wtforms import Form, StringField, TextAreaField, PasswordField, validators
from passlib.hash import sha256_crypt
app = Flask(__name__)
#init MYSQL
mysql=MySQL(app)
Run Code Online (Sandbox Code Playgroud)
发生错误的原因mysql.connection是None。这里的对象mysql是什么类型并不重要。
在对烧瓶MySQL文档MySQL.connection告诉你什么时候该属性将是None:
尝试连接到 MySQL 服务器。
返回:如果成功或
None不成功,则绑定 MySQL 连接对象。
因此,连接到服务器的尝试可能会失败。该扩展将在每个请求中打开一次与 MySQL 的连接;它未能连接成功的请求的单独请求。
查看扩展的源代码,我看到它也会None在没有应用程序上下文时返回(此时_app_ctx_stack.top为None)。您不能在请求之外使用此功能。
如果你在请求之外确实需要这个,你需要先手动创建一个应用程序上下文:
with app.app_context():
cur = mysql.connection.cursor()
Run Code Online (Sandbox Code Playgroud)