2017-07-06 10 views
-1

クライアントからデータベースにデータをアップロードして返信する簡単なWebアプリケーションを作成しようとしています。ユーザーの認証とセッションの処理を除いて、すべてが完了しました。私はFlask-WTForms(そしてフラスコtbh)の新機能です。私のサンプルコードは以下の通りです。私の問題は、試してみると、私が作ったWTFormを通して私のフォームデータを取り出すことができないということです。私はrequest.formからのみデータを取得できます。しかし、私はFlask-loginを使用しようとしているので、それは理想的ではありません。Flask-WTFormの組み合わせがデータ(request.form)を受信して​​いますが、RegistrationForm()に保存されていません

私がWTFormsでデータを取得しようとすると、うまく動作せず、失敗しますが、request.formにはデータがあります。フラスコはそれを必要としないことを知っていますが、私も試しました:

myform = RegistrationForm(request.form) 

私のフォームファイルもここにあります。

from wtforms import StringField, PasswordField, validators 
    from wtforms.validators import DataRequired 
    from flask_wtf import FlaskForm 

WTF_CSRF_ENABLED = False 

class RegistrationForm(FlaskForm): 
    username = StringField('Username', validators=[DataRequired()]) 
    password = PasswordField('Password', validators=[DataRequired()]) 

class LoginForm(FlaskForm): 
    username = StringField('Username', validators=[DataRequired()]) 
    password = PasswordField('Password', validators=[DataRequired()]) 

サイドノートでは、私はSQLは、このプロジェクトのために簡単ですけど、私は他の理由モンゴを使用しています。

+0

「[それは理想的ではありません[要求を使用する]」と言ったときの意味について詳しく説明できますか?私はFlask-loginを使用しようとしています。? –

+0

WTFormフォーム(RegistrationForm())を使用すると、認証を行い、ユーザーをもっと簡単に保存できます –

答えて

0

私の問題は、試してみると私が作った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) 
関連する問題