2016-07-30 216 views
-2

我做了所有在教程點(剛剛複製和粘貼)上陳述的內容,但是當我嘗試添加學生入口時, '添加學生'它給出TutorialsPoint - 燒瓶 - SQLAlchemy不工作

錯誤的請求 瀏覽器(或代理)發送請求,此服務器無法理解。

請告知教程是否有任何問題。

它沒有在內部DEF新的()這一行,在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) 
+0

請幫助我們瞭解您的問題?...郵政編碼,完整的錯誤信息..等.. –

+0

代碼在鏈接中。 –

+1

@UrsaMajor ..不.. ..你輸入了什麼.. !!。這不是同一件事...可能是你有一個錯字錯誤,或其他東西... –

回答

5

該教程已在學生類的缺口問題。 構造函數代碼應該縮進一級,以便它成爲學生類的一種方法。

修正碼(注:縮進 「DEF 初始化(個體經營,名稱,城市,地址,PIN):」 在下面的代碼)

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不會看到這個函數作爲學生類的構造函數。所以沒有找到具有匹配的參數數量的構造函數,導致錯誤。

+0

看起來可能還有其他問題。 –

+0

「添加用戶」與上述變化一起工作 – Davy

+0

即使學生對象代碼沒有正確縮進,如果您檢查它顯示_E111 - 縮進不是4的倍數,所以錯誤來自request.form。 – roy

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)) 

編輯
鑑於鐵拳的comment相同的代碼運行好對他來說,它很可能是有錯誤或者在你的代碼錯字創建一個新的Student對象。即使你有拷貝粘貼代碼,假設你沒有使用CTRL-V或粘貼時,輸入代碼時可能會發生錯誤。根據該瓶文檔:

發生什麼情況,如果該鍵不表單屬性存在嗎?在這種情況下會引發一個特殊的KeyError。您可以像捕獲標準的KeyError一樣捕獲它,但如果不這樣做,則會顯示HTTP 400錯誤請求錯誤頁面。所以在很多情況下,你不必處理這個問題。

因此,如果@IronFist運行沒有問題相同的代碼,但對你的返回一個壞響應錯誤,如上所述是形式缺少關鍵的結果,那麼它很有可能是錯誤的你正在運行的代碼。還請閱讀thisthis它們與您的問題類似。

+0

不遵循命名約定不會導致錯誤。 – Davy

+0

@Davy可能他在創建新生時可能有_Students_和_students_,反之亦然。 – roy

+0

@UrsaMajor錯誤的請求錯誤意味着你的表單字典有問題,你的'keys'中有一個不匹配或缺失的項目。 – roy