Flask

时间:2015-12-02 15:52:19

标签: python redirect post flask get

我的问题与this非常相似,但不幸的是,解决方案对我不起作用。

我创建了一个网络应用程序,并且有一个“以用户身份登录”'应该将用户重定向到登录表单的按钮。

app.py文件如下所示:

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        if request.form['action'] == 'Login as Guest':
            create_user(request, session)
        elif request.form['action'] == 'Login as User':
            return redirect(url_for('login'), code=307)
        elif request.form['action'] == 'Delete User':
            delete_user(request, session)
        else:
            abort("invalid form")
        return redirect(url_for('start'))

    return render_template('index.html', username=session.get('username'))


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

    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']

    return render_template('login.html', username=session.get('username'))

login.html表单如下:

<form class="form" action="" method="POST">
    <input type="text" placeholder="Username" name="username">
    <input type="password" placeholder="Password" name="password">
    <input class="btn btn-lg btn-success" name="login" type="submit" value="Login">
</form>

index.html表单如下:

<form class="form" action="" method="POST">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    <input type="submit" name="action" class="btn btn-lg btn-success {% if username == None %}disabled{% endif %}" value="Delete User">
    <input type="submit" name="action" class="btn btn-lg btn-success {% if username %}disabled{% endif %}" value="Login as Guest">
    <input type="submit" name="action" class="btn btn-lg btn-success {% if username %}disabled{% endif %}" value="Login as User">
</form>

即使我在code = 307来电中添加return redirect(url_for('login'), code=307)且请求方法为POST,当我点击以用户身份登录按钮时,我收到以下错误:< / p>

  

错误请求

     

浏览器(或代理)发送了此服务器无法发出的请求   理解。

1 个答案:

答案 0 :(得分:0)

原因:

点击&#34;以用户身份登录&#34; - &GT;转到索引端点 - &gt;重定向到登录端点。

问题是当重定向到登录端点时,您无法通过request.form['username']获取用户名,表单中没有任何内容,因此您会收到错误。

解决方案:

您的示例中仍然存在一些问题:

  • 您可以在模板中指定操作
  • login.html中用户名的用途是什么?

我将给你一个简单的例子,并帮助它。

@app.route('/', methods=['GET', 'POST'])
def index():
    ...
    return redirect(url_for('login'))  # no need for code 307
    ...

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'realusername' and password == 'realpasswd':
            redirect(url_for('success_login'))
    return render_template('login.html')

@app.route('/admin')
def success_login():
    return "Login success!"