无法将数据提交到SQLAlchemy:AttributeError:'scoped_session'对象没有属性'session'

时间:2020-03-07 11:47:11

标签: python flask sqlalchemy

我对编码还很陌生,我正在训练自己。

我正在尝试使用以下组合为网站创建注册表格: - 烧瓶 -SQLAlchemy -WTForms

我遇到了很多错误,到目前为止,检查文档很有帮助。不幸的是,我无法通过查看文档来了解如何解决此问题。如果您知道,希望您告诉我在哪里,以便下次可以自给自足。当我在网站上提交数据以注册用户时,会弹出以下错误: AttributeError: 'scoped_session' object has no attribute 'session'

这是代码:

import os

from flask import Flask, session, render_template, url_for, request
from flask_session import Session
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from forms import RegistrationForm
from models import User

app = Flask(__name__)

# Check for environment variable
if not os.getenv("DATABASE_URL"):
    raise RuntimeError("DATABASE_URL is not set")

# Set up a secret key for CSRF protection in forms (wtforms)
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY

# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Adding this to avoid it throwing an error
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))

...

@app.route("/signup", methods=["GET", "POST"])
def signup():

    # Get data from the form based on the class
    form = RegistrationForm(request.form)

    # When submitting data to the form
    if request.method == "POST":

        # Check all validations are correct
        if form.validate_on_submit():

            # Check whether the name already exists in the database
            namecheck = db.session.query(User).filter_by(uname="form.username").first()

            checker = "form.username.data"

            # namecheck = User.query.filter_by(uname="form.username").first()

            if (namecheck == checker):

                return render_template("error.html", message="Username already exists! Please pick another one.")

            else:
                # creates a "user" based on the class "User()" defined in models.py and gives it the data from the form
                user = User(uname="form.username.data", psswd="form.password.data")

                db.session.add(user)
                db.session.commit()
            return render_template("success.html", message="You have registered!")

        # if validations are NOT correct, load the form again with the right error messages
        else:
            return render_template("signup.html", form = form)

    else:
        return render_template("signup.html", form = form)

如果您能向我指出我做错的事情,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

db.session通常与Flask-SQLAlchemy一起使用,其中flask_sqlalchemy.SQLAlchemy实例通常命名为db。另一方面,您正在直接使用SQLAlchemy,尤其是使用scoped_session注册表,名为db。像会话一样使用它:

db.add(user)
db.commit()

它将这些操作代理到本地线程Session实例。