'NoneType' 对象没有属性 'cursor'
'NoneType' object has no attribute 'cursor'
我使用 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)
当我想从 mysql:
加载数据时,问题就出现了
def data():
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM users")
mysql.connection.commit()
cur.close()
data()
我收到错误:
File "app.py", line 23, in data
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)
错误发生是因为 mysql.connection
是 None
。 mysql
是什么类型的对象在这里并不重要。
Flask-MySQL documentation for MySQL.connection
告诉您该属性何时变为 None
:
Attempts to connect to the MySQL server.
Returns: Bound MySQL connection object if successful or None
if unsuccessful.
所以连接服务器的尝试可能失败了。该扩展程序将为每个请求打开一次与 MySQL 的连接;它无法根据成功请求的单独请求进行连接。
查看 source code for the extension 我发现当没有应用程序上下文时它也会 return None
(此时 _app_ctx_stack.top
是 None
).您不能在请求之外使用此功能。
如果您在请求之外确实需要这个,您需要先manually create an app context:
with app.app_context():
cur = mysql.connection.cursor()
当您的数据库连接未建立时,会出现这些错误。所以请检查您的数据库连接方法和属性,然后尝试执行。
我使用 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)
当我想从 mysql:
加载数据时,问题就出现了def data():
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM users")
mysql.connection.commit()
cur.close()
data()
我收到错误:
File "app.py", line 23, in data 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)
错误发生是因为 mysql.connection
是 None
。 mysql
是什么类型的对象在这里并不重要。
Flask-MySQL documentation for MySQL.connection
告诉您该属性何时变为 None
:
Attempts to connect to the MySQL server.
Returns: Bound MySQL connection object if successful or
None
if unsuccessful.
所以连接服务器的尝试可能失败了。该扩展程序将为每个请求打开一次与 MySQL 的连接;它无法根据成功请求的单独请求进行连接。
查看 source code for the extension 我发现当没有应用程序上下文时它也会 return None
(此时 _app_ctx_stack.top
是 None
).您不能在请求之外使用此功能。
如果您在请求之外确实需要这个,您需要先manually create an app context:
with app.app_context():
cur = mysql.connection.cursor()
当您的数据库连接未建立时,会出现这些错误。所以请检查您的数据库连接方法和属性,然后尝试执行。