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() 函数会出错(正如我之前提到的)。该错误在调试期间不会显示任何消息,也不会退出程序。因此我忽略了它。但它终止了该功能的执行。所以它没有向数据库发送任何调用。所以我把它注释掉了,瞧!有效。