Не удается отправить данные в SQLAlchemy: AttributeError: у объекта 'scoped_session' нет атрибута 'сеанс' - PullRequest
0 голосов
/ 07 марта 2020

Я довольно плохо знаком с программированием и сам тренируюсь.

Я пытаюсь создать регистрационную форму для веб-сайта, используя комбинацию: - Flask - 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 Ответ

1 голос
/ 07 марта 2020

db.session обычно используется с Flask -SQLAlchemy, в котором экземпляр flask_sqlalchemy.SQLAlchemy обычно называется db. С другой стороны, вы используете SQLAlchemy напрямую и, в частности, реестр scoped_session с именем db. Используйте его как сеанс:

db.add(user)
db.commit()

Он будет перенаправлять эти операции в локальный Session экземпляр потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...