Flask-在不重定向且没有AJAX的情况下返回帖子

时间:2019-04-18 13:28:12

标签: python flask html-form

是否有一种方法可以通过表单提交POST,而该表单在失败时不会更改页面?例如,我希望Flask仅返回一条将显示在表单下方的消息。

所有这些都无需使用AJAX

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

@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'} 

1 个答案:

答案 0 :(得分: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'))