下午好,我有一个小型的Flask应用程序,在这里我使用作为ORM和Flask-脚本来管理数据库。在manage.py中,除了使用命令"python3 manage.py runserver“运行manage.py开发服务器之外,我还可以注册这些表、添加数据和删除这些表。在此服务器上,一切正常,但是在Apache生产服务器上执行部署时,在DB中执行任何查询时,日志中会出现以下错误:"AssertionError: sqlalchemy扩展未注册到当前应用程序。
这是我的项目代码:
#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()
##################
有人能帮我吗?我已经检查了文档,但找不到错误。
发布于 2021-05-24 15:20:14
您的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)
发布于 2021-05-24 17:33:38
这个解决方案对我也不起作用。我已经看到了另一种方法,但是现在它在访问日志中的DB时给了我一个错误。我现在的代码是:
#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错误日志: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/
https://stackoverflow.com/questions/67674486
复制相似问题