【问题标题】:TypeError: __init__() got an unexpected keyword argument 'username'TypeError: __init__() 得到了一个意外的关键字参数“用户名”
【发布时间】:2017-03-22 14:53:05
【问题描述】:

我正在尝试创建自己的数据库,但出现 TypeError: __ init __() got an unexpected keyword argument 'username'。

我关注了文档和类似的堆栈溢出,但我仍然遇到同样的错误。如果我有构造函数 init 或使用方法 db.create_all() 似乎也没有什么不同。

我做错了什么?我有人愿意帮助我,谢谢:)

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

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    有几点:

    1. 如果您希望您的应用程序能够像您正在做的那样从数据创建用户,您需要为您的 SQLAlchemy 类提供一个 __init__() 方法。这就是错误告诉您的内容。 (如果您只是从表格中读取,则无需费心)
    2. 我对@9​​87654322@ 了解不多,因为我总是从外部数据库采购,但我的理解是它会创建任何不存在的表,但不会覆盖已经创建的表。因此,如果您的数据库存在,您可能不需要它。
    3. hash 是保留字。怀疑这是否搞砸了任何事情,但将其作为最佳实践进行了更改。我将其更改为将其推送到用户模型中。
    4. 完成db.commit() 后,您可以立即从创建的实例中提取 ID,而不是执行另一个 SQL 查询。
    5. 我还将您的查询更改为“ORM 方式”,因为您使用的是 SQLAlchemy,这就是您想要执行 SQL 的方式。

    更新代码:

    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"
    

    【讨论】:

    • 非常感谢。突然我遇到编译问题(与昨天的代码完全相同):“SQLAlchemy 的实例没有列、字符串和整数成员。而且他也不认识‘查询’和‘添加’。所以我首先必须弄清楚,然后我会尝试你的答案!谢谢:)
    【解决方案2】:

    @艾玛 我知道这个问题已经有一年了,但是因为 SQLAlchemy 错误

    你必须导入这些函数 在你的情况下

    从 sqlalchemy 导入列、字符串、整数

    以及您要添加的任何其他功能,只需导入它们 查看 here

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2016-03-07
      • 1970-01-01
      • 2017-10-16
      • 2020-10-22
      • 2021-11-17
      • 2016-11-01
      • 2021-10-21
      • 2021-10-15
      相关资源
      最近更新 更多