TutorialsPoint - Flask - SQLAlchemy无效

时间:2016-07-30 07:17:50

标签: python sqlite flask sqlalchemy

我完成了教程点(刚刚复制并粘贴)所述的所有内容,但是当我尝试添加学生条目时,即。 '添加学生'它给出了

错误请求 浏览器(或代理)发送了此服务器无法理解的请求。

请告知本教程是否有任何问题。

它在def new()中的这一行失败,在app.py中:

 student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin'])

无论谁将其标记下来。请注意,教程中填充了拼写错误和错误缩进。我只是一名学生。关闭它,我什么都不会学到。

参考:http://www.tutorialspoint.com/flask/flask_sqlalchemy.htm

from flask import Flask, request, flash, url_for, redirect, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
app.config['SECRET_KEY'] = "random string"

db = SQLAlchemy(app)

class Students(db.Model):
    id = db.Column('student_id', db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    city = db.Column(db.String(50))
    addr = db.Column(db.String(200)) 
    pin = db.Column(db.String(10))

    def __init__(self, name, city, addr,pin):
        self.name = name
        self.city = city
        self.addr = addr
        self.pin = pin

    @app.route('/')
    def show_all():
        return render_template('show_all.html', Students = Students.query.all() )

    @app.route('/new', methods = ['GET', 'POST'])
    def new():
        if request.method == 'POST':
            if not request.form['name'] or not request.form['city'] or not request.form['addr']:
                flash('Please enter all the fields', 'error')
        else:
            print "1";
            student = Students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin'])

            print "1";
            db.session.add(student)
            print "1";
            db.session.commit()
            print "1";
            flash('Record was successfully added')
            print "=======>>>>>>>>>";
            return redirect(url_for('show_all'))
        return render_template('new.html')

if __name__ == '__main__':
    db.create_all()
    app.run(debug = True)

2 个答案:

答案 0 :(得分:5)

该教程在学生班中有缩进问题。 构造函数代码应缩进一级,以便它成为学生类的方法。

更正后的代码:(注意“def init (自我,名称,城市,地址,图钉)的缩进:”在下面的代码中“

class students(db.Model):
   id = db.Column('student_id', db.Integer, primary_key = True)
   name = db.Column(db.String(100))
   city = db.Column(db.String(50))
   addr = db.Column(db.String(200)) 
   pin = db.Column(db.String(10))

   def __init__(self, name, city, addr,pin):
      self.name = name
      self.city = city
      self.addr = addr
      self.pin = pin

原因是,如果那个缩进不存在,python将不会将此函数视为学生类的构造函数。因此找不到具有匹配数量的参数的构造函数,从而导致错误。

答案 1 :(得分:0)

它没有遵循class naming惯例。学生班应该使用Camel case。试试这个:

student = Students(request.form['name'], request.form['city'],
        request.form['addr'], request.form['pin'])

SQLAlchemy模型也应该遵循相同的规则,学生不是学生。

class Students(db.Model):
    id = db.Column('student_id', db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    city = db.Column(db.String(50))  
    addr = db.Column(db.String(200))
    pin = db.Column(db.String(10))

修改
鉴于Iron Fist的comment相同的代码对他来说运行正常,很可能你的代码中存在错误或拼写错误,无法创建新的学生对象。即使您已复制粘贴代码,在键入代码时可能会发生错误,假设您没有使用CTRL-V或粘贴它。根据Flask文档:

  

如果表单属性中不存在键,会发生什么?在这种情况下,会引发一个特殊的KeyError。您可以像标准KeyError一样捕获它,但如果不这样做,则会显示HTTP 400错误请求错误页面。因此,在许多情况下,您不必处理该问题。

因此,如果@IronFist运行相同的代码没有问题,但是对于它返回一个错误的响应错误,如上所述是由于表单中缺少键,那么它很可能是代码中的错误你正在跑步。另请阅读thisthis,它们与您的问题类似。