【问题标题】:Python error with Flask-SQLAlchemy : init_app() firstFlask-SQLAlchemy 的 Python 错误:首先是 init_app()
【发布时间】:2021-05-24 15:07:57
【问题描述】:

下午好,我有一个小型 Flask 应用程序,我使用 Flask-SQLAlchemy 作为 ORM 和 Flask-Script 来管理数据库。除了使用命令“python3 manage.py runserver”运行 Flask 开发服务器之外,我还可以从 manage.py 注册表、添加数据和删除表。在这台服务器上一切正常,但是在 Apache Linux 生产服务器上执行部署时,在数据库中进行任何查询时,它会在日志中出现以下错误: "AssertionError: 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()

###################

有人可以帮助我吗?我已查看文档,但找不到错误。

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    您的 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, Column, ForeignKey
    from sqlalchemy import DateTime, Integer, String, Text, Float
    from werkzeug.security import generate_password_hash, 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, 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)
    

    【讨论】:

    • 看看你的 db = Sqlalchemy() 是需要改变的地方
    【解决方案2】:

    使用该解决方案也对我不起作用。我已经看到了另一种方法,但现在它在访问日志中的数据库时给了我一个错误。 我现在的代码:

    #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, Column, ForeignKey
    from sqlalchemy import DateTime, Integer, String, Text, Float
    from werkzeug.security import generate_password_hash, 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] sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 无法打开数据库文件,referer:http://192.168.0.15/ [2021 年 5 月 24 日星期一 19:16:53.895344] [wsgi:error] [pid 17380:tid 140379029477120] [client 192.168.0.15:42372](此错误的背景:http://sqlalche.me/e/14/e3q8),引用者:http://192.168.0.15/

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2015-02-20
      • 2016-02-03
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-12-16
      相关资源
      最近更新 更多