首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python SQLAlchemy: init_app() first

Python SQLAlchemy: init_app() first
EN

Stack Overflow用户
提问于 2021-05-24 15:07:57
回答 2查看 1.4K关注 0票数 0

下午好,我有一个小型的Flask应用程序,在这里我使用作为ORM和Flask-脚本来管理数据库。在manage.py中,除了使用命令"python3 manage.py runserver“运行manage.py开发服务器之外,我还可以注册这些表、添加数据和删除这些表。在此服务器上,一切正常,但是在Apache生产服务器上执行部署时,在DB中执行任何查询时,日志中会出现以下错误:"AssertionError: sqlalchemy扩展未注册到当前应用程序。

这是我的项目代码:

代码语言:javascript
运行
复制
#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)

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

代码语言:javascript
运行
复制
#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)

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

代码语言:javascript
运行
复制
#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()

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

有人能帮我吗?我已经检查了文档,但找不到错误。

EN

回答 2

Stack Overflow用户

发布于 2021-05-24 15:20:14

您的sqlalchemy需要知道哪个是您的烧瓶应用程序,您应该更改如下:

代码语言:javascript
运行
复制
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)

至:

代码语言:javascript
运行
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2021-05-24 17:33:38

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

代码语言:javascript
运行
复制
#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():
..

##########

代码语言:javascript
运行
复制
#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():



   .

###########

代码语言:javascript
运行
复制
#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错误日志:MO5.24 19:16:53.895332 2021 pid 17380:tid 140379029477120 sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)无法打开数据库文件,引用:http://192.168.0.15/ Mon 5月24日19:16:53.895344 2021 pid 17380:tid 140379029477120 (此错误背景为:http://sqlalche.me/e/14/e3q8),referer:http://192.168.0.15/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67674486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档