Flask Sqlalchemy 模型在 python shell 但不在 Web 界面中工作
Flask Sqlalchemy model working in python shell but not in web interface
我正在用 flask(python) 编写一个简单的 Web 应用程序,它会要求学生将实验数据填写到一个表单中,然后该数据将提交到服务器上。
我的用户 class 看起来像:
class User(db.Model):
id=db.Column(db.Integer,primary_key=True)
email=db.Column(db.String,unique=True)
name=db.Column(db.String)
password=db.Column(db.String)
data = db.relationship('ExpData', backref='student', lazy='dynamic')
和 ExpData class,它将存储如下数据:
class ExpData(db.Model):
id=db.Column(db.Integer,primary_key=True)
exp_1_data=db.Column(db.String)
submission_date=db.Column(db.DateTime)
user_id=db.Column(db.Integer, db.ForeignKey('user.id'))
现在 User 模型可以完美运行,而 ExpData 模型不会将任何内容放入数据库。我使用以下几行来实现它:
u=models.User(email=usern,name=nameu,password=userp,rollno=rollno)
db.session.add(u)
db.session.commit()
然后在需要的函数中:
user=g.user
dat=models.ExpData(exp_1_data='dataStr',submit=1,submission_date=datetime.now(),student=user)
db.session.add(dat)
db.session.commit()
在 Python shell 中它完美地工作。但由于某种原因,通过 Web 界面无法正常工作。
其他详情:
用户通过 Flask-Login 提供的 login_user() 函数登录
然后通过另一个装饰器
将用户分配给g.user
@app.before_request
def before_request():
g.user = current_user
然后,只要在访问 url
时执行以下函数,就会完成数据库条目
@app.route('/exp1echo', methods=['GET','POST'])
@login_required
def exp1echo():
exp1_data={}
exp1_data["ans"]=float(request.args.get("ans")) #getting some data through ajax 'get' call
user=g.user
filename = user.name+" simplePrint.pdf" # save file with user name in file name
pdf=render_template('exp1_post.html',exp1_data=exp1_data)
pisa.CreatePDF(pdf.encode("ISO-8859-1"), file(filename, "wb"))
pdf.close() # Just fyi this call does return an error
#"No handlers could be found for logger "xhtml2pdf"" but all works fine
abc={'a':1,'b':2,'c':3}
dataStr=str(abc)
dat=ExpData(exp_1_data='dataStr',submit=1,submission_date=datetime.now(),student=g.user)
db.session.add(dat)
db.session.commit()
return jsonify({'base_vl':1}) # return some value to ajax call
用户加载器定义为:
lm = LoginManager()
lm.init_app(app)
@lm.user_loader
def load_user(id):
return models.User.query.get(int(id))
用户通过以下URL注册:
@app.route('/register', methods=['GET','POST'])
def register():
if request.method == 'POST':
user_pass=request.form["password"]
user_name=request.form["username"]
name_=request.form["name"]
u=models.User(email=user_name,name=name_,password=user_pass)
db.session.add(u)
db.session.commit()
return redirect(url_for('login'))
return render_template('register_form.html')
嗯,这很尴尬!发现错误。出于某种原因,exp1echo() 中的 pdf.close() 函数会出错(正如我之前提到的)。该错误在调试期间不会显示任何消息,也不会退出程序。因此我忽略了它。但它终止了该功能的执行。所以它没有向数据库发送任何调用。所以我把它注释掉了,瞧!有效。
我正在用 flask(python) 编写一个简单的 Web 应用程序,它会要求学生将实验数据填写到一个表单中,然后该数据将提交到服务器上。
我的用户 class 看起来像:
class User(db.Model):
id=db.Column(db.Integer,primary_key=True)
email=db.Column(db.String,unique=True)
name=db.Column(db.String)
password=db.Column(db.String)
data = db.relationship('ExpData', backref='student', lazy='dynamic')
和 ExpData class,它将存储如下数据:
class ExpData(db.Model):
id=db.Column(db.Integer,primary_key=True)
exp_1_data=db.Column(db.String)
submission_date=db.Column(db.DateTime)
user_id=db.Column(db.Integer, db.ForeignKey('user.id'))
现在 User 模型可以完美运行,而 ExpData 模型不会将任何内容放入数据库。我使用以下几行来实现它:
u=models.User(email=usern,name=nameu,password=userp,rollno=rollno)
db.session.add(u)
db.session.commit()
然后在需要的函数中:
user=g.user
dat=models.ExpData(exp_1_data='dataStr',submit=1,submission_date=datetime.now(),student=user)
db.session.add(dat)
db.session.commit()
在 Python shell 中它完美地工作。但由于某种原因,通过 Web 界面无法正常工作。
其他详情: 用户通过 Flask-Login 提供的 login_user() 函数登录 然后通过另一个装饰器
将用户分配给g.user@app.before_request
def before_request():
g.user = current_user
然后,只要在访问 url
时执行以下函数,就会完成数据库条目@app.route('/exp1echo', methods=['GET','POST'])
@login_required
def exp1echo():
exp1_data={}
exp1_data["ans"]=float(request.args.get("ans")) #getting some data through ajax 'get' call
user=g.user
filename = user.name+" simplePrint.pdf" # save file with user name in file name
pdf=render_template('exp1_post.html',exp1_data=exp1_data)
pisa.CreatePDF(pdf.encode("ISO-8859-1"), file(filename, "wb"))
pdf.close() # Just fyi this call does return an error
#"No handlers could be found for logger "xhtml2pdf"" but all works fine
abc={'a':1,'b':2,'c':3}
dataStr=str(abc)
dat=ExpData(exp_1_data='dataStr',submit=1,submission_date=datetime.now(),student=g.user)
db.session.add(dat)
db.session.commit()
return jsonify({'base_vl':1}) # return some value to ajax call
用户加载器定义为:
lm = LoginManager()
lm.init_app(app)
@lm.user_loader
def load_user(id):
return models.User.query.get(int(id))
用户通过以下URL注册:
@app.route('/register', methods=['GET','POST'])
def register():
if request.method == 'POST':
user_pass=request.form["password"]
user_name=request.form["username"]
name_=request.form["name"]
u=models.User(email=user_name,name=name_,password=user_pass)
db.session.add(u)
db.session.commit()
return redirect(url_for('login'))
return render_template('register_form.html')
嗯,这很尴尬!发现错误。出于某种原因,exp1echo() 中的 pdf.close() 函数会出错(正如我之前提到的)。该错误在调试期间不会显示任何消息,也不会退出程序。因此我忽略了它。但它终止了该功能的执行。所以它没有向数据库发送任何调用。所以我把它注释掉了,瞧!有效。