私の問題は、試してみると私が作ったWTFormを通してフォームデータを取り出すことができないということです。私はrequest.formからのみデータを取得できます。
私の理解では、request.form
へのアクセスが実際にあなたは、フォームのデータを取得することになっている方法であることです。
まず、いくつかの問題は、私が発見:
- を
load_user()
では、データベース内の実際のレコードを表しORMが作成したオブジェクトではなく、全く新しいUser
オブジェクトを返すように思われるreturn User(u['username'])
を書きます。この問題は、データベースに余分なデータが含まれていないということです。名前はu['username']
に設定されたUserオブジェクトになります。
register()
には、指定された名前が既に存在するかどうかを最初に確認することなく、新しいユーザーをデータベースに挿入しようとしています。
Flaskアプリケーションのサインアップとログインを設定しただけで面倒だったので、最後にコードを表示して時間を節約しようとします。私はこれらを別々のファイルに入れていますが、それらをすべて1つのファイルにまとめることもできます。それらを別々のファイルに分けて、実際に青写真を含む別の複雑なレイヤーを追加し、モデルファイルを正しい方法で作成しました。
routes.py
:
(...)
web_routes = Blueprint('web_routes', __name__)
(...)
@web_routes.route('/signup', methods=['GET', 'POST'])
def signup():
form = SignupForm()
if request.method == 'GET':
return render_template('signup.html', form=form)
elif request.method == 'POST':
if form.validate_on_submit():
if User.query.filter_by(email=form.email.data).first():
return "Email address already exists"
else:
new_user = User(form.email.data, form.password.data)
db.session.add(new_user)
db.session.commit()
login_user(new_user)
return redirect(url_for('web_routes.pay'))
else:
return "Form didn't validate"
@web_routes.route('/login', methods=['GET','POST'])
def login():
form = SignupForm()
if request.method == 'GET':
return render_template('login.html', form=form)
elif request.method == 'POST':
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user:
if user.check_password(form.password.data):
login_user(user)
return redirect(url_for('web_routes.app'))
else:
return "Wrong password"
else:
return "user doesn't exist"
else:
return "form not validated"
forms.py
:
(...)
class LoginForm(FlaskForm):
username = StringField('username', validators=[DataRequired()])
class SignupForm(Form):
email = StringField('email')
password = PasswordField('password')
submit = SubmitField("Sign In")
models.py
:
from werkzeug.security import generate_password_hash, \
check_password_hash
(...)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
email = db.Column(db.String(80), primary_key=True, unique=True)
password_hash = db.Column(db.String(200))
def __init__(self, email, password):
self.email = email
self.set_password(password)
def __repr__(self):
return '<User %r>' % self.email
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return str(self.email)
def init_db():
db.create_all()
# Create a test user
new_user = User('[email protected]', 'aaaaaaaa')
db.session.add(new_user)
db.session.commit()
if __name__ == '__main__':
init_db()
app.py
:
(...)
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
@login_manager.user_loader
def load_user(email):
from models import User
return User.query.filter_by(email=email).first()
if __name__ == '__main__':
from routes import web_routes
app.register_blueprint(web_routes)
# To get PyCharm's debugger to work, you need to have "debug=False, threaded=True"
#app.run(debug=False, threaded=True)
app.run(debug=True)
「[それは理想的ではありません[要求を使用する]」と言ったときの意味について詳しく説明できますか?私はFlask-loginを使用しようとしています。? –
WTFormフォーム(RegistrationForm())を使用すると、認証を行い、ユーザーをもっと簡単に保存できます –