如何解决Flask-SQLAlchemy 的 Python 错误:init_app() first
下午好,我有一个小的 Flask 应用程序,我使用 Flask-sqlAlchemy 作为 ORM 和 Flask-Script 来管理数据库。除了使用命令“python3 manage.py runserver”运行 Flask 开发服务器之外,我还可以从 manage.py 注册表、添加数据和删除表。在这台服务器上一切正常,但是在 Apache Linux 生产服务器上执行部署时,在数据库中执行任何查询时,它在日志中给我以下错误: “断言错误:sqlalchemy 扩展未注册到当前应用程序。请确保先调用 init_app()。”
这是我的项目代码:
#main.py
from flask import Flask
#all imports
app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
csrf = CSRFProtect(app)
@app.route('/',methods = ['GET','POST'])
def login():
from models import Usuario
login_form = LoginForm(request.form)
if request.method == 'POST' and login_form.validate():
username = login_form.username.data
password= login_form.password.data
usuario = Usuario.query.filter_by(username = username).first()
if usuario is not None:#Ha enconTrado el usuario
if usuario.verify_password(password):
# Login OK
flash(u"Bienvenido {0}".format(username),'ok')
return render_template('login_ok.html',username=username )
else:
#password not ok
flash(u"Contraseña incorrecta",'error')
#redirect(url_for("login"))
else:
flash(u"Usuario no enconTrado",'error')
#redirect(url_for("login"))
return render_template("login.html",form = login_form)
############################################
#models.py
from flask_sqlalchemy import sqlAlchemy
from sqlalchemy import Boolean,Column,ForeignKey
from sqlalchemy import DateTime,Integer,String,Text,Float
from werkzeug.security import generate_password_hash,check_password_hash
db = sqlAlchemy()
class Usuario(db.Model):
__tablename__ = 'usuarios'
id = Column(Integer,primary_key = True)
username = Column(String(50),unique = True)
password = Column(String(128))
nombre = Column(String(50))
email = Column(String(50),unique = True)
admin = Column(Boolean,default=False)
def __init__(self,username,password,nombre,email,admin):
self.username = username
self.password = self.__create_password(password)
self.nombre = nombre
self.email = email
self.admin = admin
#declaramos una funcion privada para encriptar el password
def __create_password(self,password):
return generate_password_hash(password)
#declaramos una funcion privada para comparar los passwords encriptados(True si son iguales)
def verify_password(self,password):
return check_password_hash(self.password,password)
########################################
#manage.py
from flask_script import Manager
from main import app,db #importamos app,db desde main.py
from models import Usuario
from flask_wtf.csrf import CSRFProtect
manager = Manager(app)
app.config['DEBUG'] = True
db.init_app(app)
@manager.command
def hello():
print("hello")
@manager.command
def create_tables():
db.create_all()
@manager.command
def drop_tables():
db.drop_all()
@manager.command
def add_data_tables():
db.create_all()
usuario = Usuario(username = "user",password = "user",nombre= "User",email="user@hotmail.com",admin=False)
db.session.add(usuario)
db.session.commit()
@manager.command
def create_admin():
usuario = {"username": input("Usuario:"),"password": input("Password:"),"nombre": input("Nombre completo:"),"email": input("Email:"),"admin": True}
usu = Usuario(**usuario)
db.session.add(usu)
db.session.commit()
if __name__ == '__main__':
manager.run()
##################
有人可以帮我吗?我已查看文档,但找不到错误。
解决方法
您的 sqlalchemy 需要知道哪个是您的烧瓶应用程序
你应该改变这个:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Boolean,Column,ForeignKey
from sqlalchemy import DateTime,Integer,String,Text,Float
from werkzeug.security import generate_password_hash,check_password_hash
db = SQLAlchemy()
class Usuario(db.Model):
__tablename__ = 'usuarios'
id = Column(Integer,primary_key = True)
username = Column(String(50),unique = True)
password = Column(String(128))
nombre = Column(String(50))
email = Column(String(50),unique = True)
admin = Column(Boolean,default=False)
def __init__(self,username,password,nombre,email,admin):
self.username = username
self.password = self.__create_password(password)
self.nombre = nombre
self.email = email
self.admin = admin
#declaramos una funcion privada para encriptar el password
def __create_password(self,password):
return generate_password_hash(password)
#declaramos una funcion privada para comparar los passwords encriptados(True si son iguales)
def verify_password(self,password):
return check_password_hash(self.password,password)
至:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Boolean,check_password_hash
# You need to import you app = Flask(__name__) from you main.py
from main import app
# And pass it to SQLAlchemy like this:
db = SQLAlchemy(app=app)
class Usuario(db.Model):
__tablename__ = 'usuarios'
id = Column(Integer,password)
,
使用该解决方案对我也不起作用。我已经看到了另一种方法来做到这一点,但现在它在访问日志中的数据库时给了我一个错误。 我现在的代码:
#main.py
from flask import Flask
from config import DevelopmentConfig
from flask import render_template,request,flash
from flask_sqlalchemy import SQLAlchemy
from forms import LoginForm
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
csrf = CSRFProtect(app)
db = SQLAlchemy(app)
@app.route('/',methods = ['GET','POST'])
def login():
..
##########
#manage.py
from flask_script import Manager
from main import app,db #importamos app,db desde main.py
from models import Usuario
from flask_wtf.csrf import CSRFProtect
manager = Manager(app)
app.config['DEBUG'] = True
@manager.command
def hello():
.
###########
#models.py
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Boolean,check_password_hash
from main import db
class Usuario(db.Model):
__tablename__ = 'usuarios'
.
.
########## 在开发服务器上它工作正常,但在 apache 上不起作用
Apache 错误日志:[Mon May 24 19:16:53.895332 2021] [wsgi:error] [pid 17380:tid 140379029477120] [client 192.168.0.15:42372] (sqlOperationalchemable.Error.exc.Erroraltion3Operational.Error)打开数据库文件,引用:http://192.168.0.15/ [Mon May 24 19:16:53.895344 2021] [wsgi:error] [pid 17380:tid 140379029477120] [client 192.168.0.15:42372](此错误的背景),{3} 参考:{3} }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。