微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flask-SQLAlchemy 的 Python 错误:init_app() first

如何解决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 举报,一经查实,本站将立刻删除。