2017-03-22 4 views
0

Ich versuche, meine eigene Datenbank zu erstellen, aber ich erhalte einen TypeError: __ init __() hat ein unerwartetes Schlüsselwort Argument 'Benutzername'.TypeError: __init __() hat ein unerwartetes Schlüsselwort Argument 'Benutzername'

Ich folgte Dokumentation und ähnliche Stack-Überläufe, aber ich bekomme immer noch den gleichen Fehler. Es scheint auch keinen Unterschied zu machen, wenn ich einen Konstruktor init habe oder die Methode db.create_all() verwende.

Was mache ich falsch? Ich jemand bereit ist, mir zu helfen, danke :)

from flask import Flask, flash, redirect, render_template, request, session, url_for 
from flask_sqlalchemy import SQLAlchemy 
from flask_session import Session 
from passlib.apps import custom_app_context as pwd_context 
from tempfile import gettempdir 

# configure application 
app = Flask(__name__) 

#Flask-SQLAlchemy https://www.tutorialspoint.com/flask/flask_sqlalchemy.htm 
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///froshims3.db" 
db = SQLAlchemy(app) 

# configure session to use filesystem (instead of signed cookies) 
app.config["SESSION_FILE_DIR"] = gettempdir() 
app.config["SESSION_PERMANENT"] = False 
Session(app) 

class users(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    username = db.Column(db.String) 
    hash = db.Column(db.String) 

# def __init__(self, username, password): 
# self.username = username 
# self.password = password 

#db.create_all() 

@app.route("/") 
def index(): 
    return apology("TODO") 

@app.route("/register", methods=["GET", "POST"]) 
def register(): 
    """Register user.""" 
    if request.method == "GET": 
     # redirect user to register page 
     return render_template("register.html") 

    else: 
     # query database to see if username doesn't exist. 
     rows = db.session.query("SELECT * FROM users WHERE username = :username", username=request.form.get("username")) 
     if len(rows) == 1: 
      return apology("username already exist") 

     # hash: http://stackoverflow.com/questions/7627752/secure-authentication-system-in-python 
     hash = pwd_context.encrypt(request.form["password"]) 
     user = Users(request.form["username"], request.form["dorm"]) 
     db.session.add(user) 
     db.session.commit() 
     user_id = db.session.query("SELECT id from users WHERE username = :username", username=request.form.get("username")) 
     session["user_id"]= user_id 
    return apology("Well Done") 

Antwort

1

Ein paar Dinge:

  1. Sie benötigen eine __init__() Methode für Ihre SQLAlchemy Klasse, wenn Sie Ihre App mögen, dass Benutzer in der Lage sein zu erstellen aus Daten wie du es tust. Dies ist es, was der Fehler Ihnen sagt. (Sie müssen sich nicht darum kümmern, wenn Sie nur aus einer Tabelle lesen)
  2. Ich weiß nicht viel über db.create_all(), weil ich immer aus externen Datenbanken Sourcing bin, aber mein Verständnis ist es wird jede erstellen Tabellen, die nicht existieren, aber nicht überschriebene Tabellen überschreiben. Wenn Ihre Datenbank existiert, brauchen Sie sie wahrscheinlich nicht.
  3. hash ist ein reserviertes Wort. Zweifeln, dass dies alles vermasselt hat, aber es als eine Frage der Best Practice geändert hat. und ich habe das geändert, um es in das Benutzermodell zu schieben.
  4. Sie können die ID direkt von der erstellten Instanz ziehen, nachdem Sie db.commit() ausgeführt haben, anstatt eine andere SQL-Abfrage auszuführen.
  5. Ich habe auch Ihre Abfrage auf den "ORM Way" geändert, da Sie SQLAlchemy verwenden, so möchten Sie Ihr SQL machen.

Aktualisiert Code:

from flask import Flask, flash, redirect, render_template, request, session, url_for 
from flask_sqlalchemy import SQLAlchemy 
from flask_session import Session 
from passlib.apps import custom_app_context as pwd_context 
from tempfile import gettempdir 

# configure application 
app = Flask(__name__) 

#Flask-SQLAlchemy https://www.tutorialspoint.com/flask/flask_sqlalchemy.htm 
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///froshims3.db" 
db = SQLAlchemy(app) 

# configure session to use filesystem (instead of signed cookies) 
app.config["SESSION_FILE_DIR"] = gettempdir() 
app.config["SESSION_PERMANENT"] = False 
Session(app) 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    username = db.Column(db.String) 
    hash = db.Column(db.String) 

    def __init__(self, username, password): 
     self.username = username 
     self.password = password 

db.create_all() 

@app.route("/") 
def index(): 
    return "TODO" 

@app.route("/register", methods=["GET", "POST"]) 
def register(): 
    """Register user.""" 
    if request.method == "GET": 
     # redirect user to register page 
     return render_template("register.html") 

    else: 
     # query database to see if username doesn't exist. 
     # ORM Way: 
     exists = User.query.filter_by(username=request.form.get("username")).count() 
     if exists: 
      return "username already exists" 

     # hash: http://stackoverflow.com/questions/7627752/secure-authentication-system-in-python 
     hash_pwd = pwd_context.encrypt(request.form["password"]) 
     user = User(request.form["username"], hash_pwd) 
     db.session.add(user) 
     db.session.commit() 
     session["user_id"]= user.id 
    return "Well Done" 
+0

Ihnen sehr danken. Plötzlich bekomme ich Kompilierprobleme (mit genau dem gleichen Code wie gestern): "Instanz von SQLAlchemy hat keine Spalte, String und Integer-Member. Und 'Query' und 'Add' erkennt er auch nicht. Also muss ich zuerst Finde das heraus und dann werde ich deine Antwort versuchen! Danke :) – emma

Verwandte Themen