Flask - 返回一个没有重定向的帖子,没有AJAX

问题描述 投票:0回答:1

有没有办法从表单提交POST,失败时不会更改页面?例如,我希望Flask只返回一个将显示在表单下方的消息。

所有这些都不使用AJAX

我当前的代码(json msgs不起作用):

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return try_login(request.form.get('email'), request.form.get('password'))
    else:
        if 'username' in session:
            return redirect(url_for('home'))
        else:
            return """
                <form action="{}" method="post">        
                    <label for="email">Email</label>
                    <input type="email" name="email" id="email">
                    <label for="password">Password</label>
                    <input type="password" name="password" id="password">
                    <input type="submit" value="Login">
                </form>
            """.format(url_for('login'))

def try_login(email, pswrd):
    if email and pswrd:
        usr = User.get_user_by_email(email)
        if usr:
            if usr.authenticate(pswrd):
                return redirect(url_for('home'))
            else:
                return {'msg' : 'Wrong Password'}
        else:
            return {'msg' : 'User or Password wrong'}
    else:
        return {'msg' : 'Email and Password are required'} 
python flask html-form
1个回答
1
投票

由于您不想使用AJAX,我将假设您不想使用任何其他形式的异步请求(部分加载HTML或JSON)。

但是,如果要部分更新任何HTML页面,则必须向服务器发出异步请求,然后将响应应用于要更改的HTML部分。

如果您不打算发出异步请求,则必须返回添加了消息的HTML页面。

例如,在您的代码中,您可以执行以下操作:

FORM_TEMPLATE = """
<form action="{}" method="post">        
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <label for="password">Password</label>
    <input type="password" name="password" id="password">
    <input type="submit" value="Login">
</form>
"""

ERROR_TEMPLATE = """
<p style="color: red;"> {} </p>
"""

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return try_login(request.form.get('email'), request.form.get('password'))
    else:
        if 'username' in session:
            return redirect(url_for('home'))
        else:
            FORM_TEMPLATE.format(url_for('login'))

def try_login(email, pswrd):
    if email and pswrd:
        usr = User.get_user_by_email(email)
        if usr:
            if usr.authenticate(pswrd):
                return redirect(url_for('home'))
            else:
                return ERROR_TEMPLATE.format('Wrong Password') + FORM_TEMPLATE.format(url_for('login'))
        else:
            return ERROR_TEMPLATE.format('User or Password wrong') + FORM_TEMPLATE.format(url_for('login'))

    else:
            return ERROR_TEMPLATE.format('Email and Password are required') + FORM_TEMPLATE.format(url_for('login'))
© www.soinside.com 2019 - 2024. All rights reserved.