我对编码还很陌生,我正在训练自己。
我正在尝试使用以下组合为网站创建注册表格: - 烧瓶 -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)
如果您能向我指出我做错的事情,我将不胜感激。
答案 0 :(得分:1)
db.session
通常与Flask-SQLAlchemy一起使用,其中flask_sqlalchemy.SQLAlchemy
实例通常命名为db
。另一方面,您正在直接使用SQLAlchemy,尤其是使用scoped_session
注册表,名为db
。像会话一样使用它:
db.add(user)
db.commit()
它将这些操作代理到本地线程Session
实例。