2016-07-30 8 views
-2

Ich tat alles, was im Tutorial Punkt (nur kopiert und eingefügt) angegeben wurde, aber wenn ich versuchte, einen Studenteneintrag, d. 'Add Student' gibt esTutorials - Flask - SQLAlchemy funktioniert nicht

Bad Request Der Browser (oder Proxy) schickte eine Anfrage, die dieser Server nicht verstehen konnte.

Bitte geben Sie an, wenn mit dem Lernprogramm etwas nicht stimmt.

Es befindet sich auf dieser Linie innerhalb def neuen fehlgeschlagen(), in app.py:

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

Wer diese herunter markieren. Beachten Sie, dass es das Tutorial ist, das mit Tippfehlern und falschen Einrückungen gefüllt ist. Ich bin nur ein Student. Mach das runter und ich werde nichts lernen.

Ref: 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

Bitte helfen Sie uns, Ihr Problem hier zu verstehen? ... Postleitzahl, vollständige Fehlermeldung .. etc .. –

+0

Der Code ist in der Verbindung. –

+1

@UrsaMajor .. No.post, was Sie eingegeben haben .. !!. es ist nicht das gleiche ... Vielleicht haben Sie einen Tippfehler oder etwas anderes ... –

Antwort

5

Das Tutorial hat eine Vertiefung Problem in der Schülerklasse. Der Konstruktorcode sollte um eine Stufe eingerückt werden, damit er zu einer Methode der Schülerklasse wird.

Corrected Code: (man beachte den Gedankenstrich "def init (self, Name, Stadt, addr, Stift):" im Code unten)

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 

Der Grund dafür ist, wenn dieser Gedankenstrich nicht da, Python wird diese Funktion nicht als Konstruktor der Studentenklasse sehen. Daher wird der Konstruktor mit der passenden Anzahl von Argumenten nicht gefunden, was zu dem Fehler führt.

+0

Sieht so aus, als könnte es auch andere Probleme geben. –

+0

"Benutzer hinzufügen" funktioniert mit der oben genannten Änderung – Davy

+0

Selbst der Student Objektcode ist nicht richtig eingerückt, wenn Sie überprüfen, es zeigt _E111 - Einrückung ist kein Vielfaches von vier_ so der Fehler ergibt sich aus der Anfrage.form. – roy

0

Es folgt nicht der class naming Konvention. Die Schülerklasse sollte Camel case verwenden. Versuchen Sie dies:

Das SQLAlchemy-Modell sollte auch die gleichen, Studenten nicht Studenten folgen.

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

bearbeiten
Da Iron Fist der comment, die den gleichen Code in Ordnung für ihn läuft, seine sehr wahrscheinlich, dass es ein Fehler ist, oder in Ihrem Code Typo einen neuen Schüler Objekt zu schaffen. Selbst wenn Sie den Code kopiert haben, kann beim Eingeben des Codes ein Fehler auftreten, vorausgesetzt, Sie haben STRG-V nicht verwendet oder eingefügt. Nach Flask-Dokumentation:

Was passiert, wenn der Schlüssel nicht im Formularattribut vorhanden ist? In diesem Fall wird ein spezieller KeyError ausgelöst. Sie können es wie einen Standard-KeyError abfangen, aber wenn Sie dies nicht tun, wird stattdessen eine HTTP 400 Bad Request-Fehlerseite angezeigt. In vielen Situationen müssen Sie sich nicht mit diesem Problem befassen.

Deshalb, wenn @IronFist den gleichen Code ohne Probleme läuft, aber für Sie seine einen schlechte Antwort Fehler zurückgegeben, die, wie oben erläutert ist als Ergebnis eines fehlenden Schlüssels in Form, dann wird sie wahrscheinlich ein Fehler auf der Code, den Sie ausführen. Lesen Sie auch this und this sie sind Ihrer Frage ähnlich.

+0

Das Nichtbefolgen der Namenskonvention führt nicht zu einem Fehler. – Davy

+0

@Davy ist möglich, er kann _Students_ in der Klasse und _students_ beim Erstellen des neuen Studenten oder umgekehrt haben. – roy

+0

@UrsaMajor Der Fehler der fehlerhaften Anforderung bedeutet, dass mit Ihrem Formularwörterbuch etwas nicht stimmt. In Ihren "Schlüsseln" ist ein nicht übereinstimmender oder fehlender Eintrag vorhanden. – roy

Verwandte Themen