烧瓶登录问题给出400错误

时间:2016-05-02 17:09:36

标签: python flask flask-wtforms flask-login

我正在为我的登录路线制作一个小瓶子应用程序并正在测试我尝试登录好电子邮件但密码错误的部分。我想要通用"无效的用户名/ pw组合"消息,所以他们知道他们犯了一个错误,但黑客不知道错误是什么。我到达了我无法相信的部分,即使这不起作用也是如此。因为我想做的就是重新渲染表格。我试图添加错误消息,但只是想让页面现在首先工作。

views.py:

@application.route('/login', methods=['GET', 'POST'])
def login(message=""):
    form = LoginForm()
    if request.method == 'POST' and form.validate_on_submit():
        email = form.email.data
        password = form.password.data
        user = User.query.filter_by(email=email, password=password).first()
        print(user)
        try:
            login_user(user)
        except AttributeError:
            print('in the except')
            form = LoginForm()
            # even this doesn't work?
            return render_template('login.html', form=form)

        flash('Logged in successfully.')
        next_url = request.args.get('next')
        return redirect(next_url or url_for('main'))

    return render_template('login.html', form=form)

forms.py:

from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, TextField, PasswordField, validators
from wtforms.validators import Required


class LoginForm(Form):
    email = StringField('email', [Required()])
    password = PasswordField('password', [Required()])

模板:

{% extends "base.html" %}

{% block title %}Login{% endblock %}

{% block content %}
    <h2> Welcome to the status page</h2>
    <br>
    <form action="{{ url_for('login') }}" method="post" name="login_user">
        {{ form.hidden_tag() }}
        <p>Please log in:<br>
            Email:<br>
            {{ form.email }}<br>
            {% for error in form.email.errors %}
                <p><span style="color: red">[{{ error }}]</span></p>
            {% endfor %}
            Password:<br>
            {{ form.password }}<br>
            {% for error in form.password.errors %}
                <p><span style="color: red">[{{ error }}]</span></p>
            {% endfor %}
        </p><br>
        <p><input type="submit" value="Submit"></p>
    </form>
    <p><a href="{{ url_for('register') }}">I need to register</a></p>

<script type="text/javascript"> 

</script>

{% endblock %}

最糟糕的部分是我收到此反社会错误消息:

127.0.0.1 - - [02 / May / 2016 11:47:41]&#34; POST / login HTTP / 1.1&#34; 400 -

我的狗,声带差异很大,与烧瓶相比debug=True传播得更好。我在任何地方都能得到这些,我尝试按照我想要的方式处理表单,并且它会增加400.除了400之外的错误还有一个方便的堆栈跟踪。

现在,GET加载页面并显示一个空表单(好)。使用正确的电子邮件/ pw的POST工作并将用户登录。错误的路径是存在的正确电子邮件,但是与用户不匹配的错误pw

进入shell工作时会超过print('in the except')form = LoginForm(),但无法返回render_template

BadRequestKeyError: 400: Bad Request

所有这一切

我确实有一个可以通过GET或POST工作并处理错误的视图。两者都呈现相同的模板,唯一的区别是表单是否有错误:

表格:

class WebsiteCheckForm(Form):
    name = StringField('name')
    url = StringField('url')

视图:

def handle_admin_form(form):
    if form.name.data:
        if validators.url(form.url.data):
            Website.create(name=form.name.data, url=form.url.data)
        else:
            form.url.errors = ("Please enter a valid URL",)
    else:
        manual_url = form.url.data.replace('http://', '')
        if manual_url:
            form.name.errors = ("Name is required if you want to add a website",)

@application.route('/admin/', methods=['GET', 'POST'])
def admin():
    if current_user.is_authenticated and not current_user.approved:
        return redirect(url_for('awaiting_approval'))

    form = WebsiteCheckForm()
    if request.method == 'GET':
        form.url.data = 'http://'
    db = get_db()
    if request.method == 'POST':
        handle_admin_form(form)
        try:
            delete_websites(request)
            approve_users(request)
        except:
            redirect(url_for('admin'))
        form.url.data = 'http://'
        form.name.data = ''
    websites = Website.query.all()
    users = User.query.all()
    users_needing_approval = [user for user in users if not user.approved]
    return render_template('admin.html', form=form, websites=websites, users_needing_approval=users_needing_approval)

当我处理表单时,如何制作瓶子渲染模板页面,并让它说出错误是什么?谢谢

解答:

这种不良行为可以通过这个答案来解决exception for non existing parameter in FLASK

#!/usr/bin/env python

from app import application

application.config['TRAP_BAD_REQUEST_ERRORS'] = True

if __name__ == '__main__':
    application.run(debug=True)

让我在

中误解了逻辑
@login_manager.request_loader
def request_loader(request):

我的flask-login设置的一部分。票证已经打开以解决此问题(简洁的400错误)

1 个答案:

答案 0 :(得分:1)

我在验证单个布尔字段时遇到了类似的问题。

我使用

解决了这个问题
remember = form.rememberme.data instead of request.form['remember_me']

ُThis link gave me the idea