【发布时间】: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