2017-07-06 18 views
-1

我試圖製作一個簡單的Web應用程序,我可以將數據從客戶端上傳到數據庫,然後將其發回。除了用戶認證和會話處理之外,我已經完成了一切。我是Flask-WTForms(和燒瓶tbh)的新手,我的示例代碼如下。我的問題是,當我嘗試時,我無法通過我所做的WTForm檢索我的表單數據。我只能從request.form獲取數據。然而這並不理想,因爲我正在嘗試使用Flask-login。Flask-WTForm組合正在接收數據(request.form),但沒有保存在RegistrationForm()中

@login_manager.user_loader 
def load_user(username): 
    USERS = mongo.db.users 
    u = USERS.find_one({"username": username}) 
    if not u: 
     return None 
    return User(u['username']) 

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    USERS = mongo.db.users 
    myform = RegistrationForm() 
    if myform.validate_on_submit(): 
     USERS.insert({"Username": myform.username.data, "Password": 
myform.password.data}) 
     return "REGISTERED" 
    print(request.form["Username"]) 
    return "ERROR: Your request failed" 

當我嘗試通過WTForms獲取數據時,它不起作用並失敗,但request.form包含數據。我知道flask_wtf不需要它,但我也試過:

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對於這個項目來說比較容易,但是我因爲其他原因使用了mongo。

+0

當你說「[它]不是理想的(使用請求)時,你能詳細說明你的意思嗎?窗體],因爲我試圖使用Flask-login「? –

+0

使用WTForm窗體(RegistrationForm())讓我進行身份驗證並以更容易的方式保存用戶 –

回答

0

我的問題是,當我嘗試我無法通過我所做的WTForm檢索我的表單數據。我只能從request.form獲取數據。

我的理解是,訪問request.form其實你應該取回您的表單數據的方式。

首先,有些問題我發現:

  • load_user(),你寫return User(u['username']),這似乎是回到了一個全新的User對象,而不是代表在數據庫中的實際記錄的ORM創建的對象。問題在於它不會有任何額外的數據在數據庫中;它只是一個名爲u['username']的用戶對象。
  • register()中,您正嘗試將新用戶插入數據庫,而無需先檢查指定的名稱是否已存在。

我剛剛爲我的Flask應用程序設置了註冊並登錄,這很麻煩,所以我會盡量通過向您顯示我最終的代碼來節省您一些時間。我有這些在單獨的文件,但你也可以在一個文件中全部。將它們分離爲單獨的文件實際上增加了一層複雜的涉及藍圖並以正確的方式創建模型文件。

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) 
相關問題