【问题标题】:Why does Flask redirect me to the index?为什么 Flask 将我重定向到索引?
【发布时间】:2021-08-31 21:33:41
【问题描述】:

当我给出提交按钮时,它不会验证它没有输入“POST”请求的 if 和 login_form.validate()

我尝试学习,但我已经尝试解决这个问题 5 小时,我不再知道该怎么做。

@app.route('/login', methods = ['GET','POST'])
def login():

    login_form = forms.logger(request.form)
    title = 'Gamework'
    
    #imprimira los datos en la consola si el metodos es post y los datos son validos
    if request.method == 'POST' and login_form.validate():
        print('Hola mundo')
        email = login_form.email.data
        
        password = login_form.password.data
         
        user = User.query.filter_by(email = email).first()

        if user is not None and user.verify_password(password):
            print('test 2')
            succes_menssage = 'Se ha iniciado correctamente {}'.format(email)
            
            flash(succes_menssage)
            session['Email'] = email
            return redirect( url_for('index') )
   
    
    return render_template('logger_user.html', title = title, form = login_form)

这里我显示Models.py。当我进入登录函数验证post请求和表单验证时,它只向我发送JSON并且什么都不做,它只是停留在同一个目录而不是去。

from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash
from werkzeug.security import check_password_hash
import datetime
db = SQLAlchemy()

class User(db.Model):
    
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(20), unique = True)
    email = db.Column(db.String(40))
    password = db.Column(db.String(256))
    create_date = db.Column(db.DateTime, default = datetime.datetime.now)
    
    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = self.__create_password(password)
    
    def __create_password(self, password):
        return generate_password_hash(password)
    def verify_password(self, password):
        r = check_password_hash(self.password, password)
        print(r)
    
        return r

可能是什么?这是页面:

【问题讨论】:

  • 如果你不能让它满足if子句的条件,要么它不是一个POST请求,要么表单没有验证,所以你需要检查哪个条件(s ) 失败。 ,要么在你的 IDE 中使用调试器来查看requestlogin_form 对象的状态,要么使用战略性的print 调用来执行此操作; 例如print(str(login_form))

标签: flask flask-wtforms flask-login


【解决方案1】:

这里没有足够的信息来全面调试您的问题 - 但就如何继续调查而言;

  • 您确定要发出 POST 请求吗?
    • if 语句之外添加print(request.method)
  • 您对login_form.validate() 的呼叫是否返回True?我猜不会。
    • 您可以通过添加print(login_form.validate()) 来调试它,如果返回False,请检查login_form.errors (docs here) 的内容。这将包含有关验证失败的确切原因的信息。如何进行将取决于此。

【讨论】:

  • 理论上 login_form 应该是假的,直到它被填满(在进行验证时,我建议 login_form.errors 没有抛出任何东西)如果它抛出我之外的打印(request.method)一个 GET
猜你喜欢
  • 2021-07-01
  • 2023-03-21
  • 2015-12-19
  • 2019-09-10
  • 2015-03-23
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多