烧瓶中的表单动作未重定向到路由

时间:2020-10-08 12:13:57

标签: python flask flask-restful flask-login

简而言之,我只是尝试通过在我的login.html模板中使用以下代码来重定向到url:

     <form>
          <form action="/sessions">      
          <p>Username:</p>
          <p><input type="text" minlength="8" name="username"required /></p>
          <p>Password:</p>
          <p><input type="text" name="password"/></p>
          <input type="submit" value="Submit">
    </form> 

def login():
    print("inside login")
    return render_template('login.html')


@app.route("/sessions", methods=["GET","POST"])
def sessions():
    userid  = request.form.get("userid")
    password  = request.form.get("password")
    return request.form.get("userid"), request.form.get("password")

,但停留在login()网址上。我也尝试过

 <form action="{{ url_for('sessions') }}">

,但效果不佳。不确定我缺少什么?请任何提示/想法将不胜感激。

2 个答案:

答案 0 :(得分:2)

尝试一下(我刚刚添加了另一行,已注释的行):

@app.route("/sessions", methods=["GET","POST"])
def sessions():
    userid  = request.form.get("userid")
    password  = request.form.get("password")
    if request.method == 'POST':  #additional line
        return request.form.get("userid"), request.form.get("password")

答案 1 :(得分:0)

更新后的答案反映了新的评论

在您的代码中发现了几个问题:

  1. HTML表单不正确,您正在使用表单中的表单
     <form>
          <form action="/sessions">      
          <p>Username:</p>
          <p><input type="text" minlength="8" name="username"required /></p>
          <p>Password:</p>
          <p><input type="text" name="password"/></p>
          <input type="submit" value="Submit">
    </form> 

您应该将其更改为此


<html>
    <body>
        <h1>This is login page</h1>
        <form action="{{ url_for('login') }}" method="POST">
            <p>Username:</p>
            <p><input type="text" minlength="8" name="username"required /></p>
            <p>Password:</p>
            <p><input type="text" name="password"/></p>
            <input type="submit" value="Submit">
        </form> 
    </body>
</html>

通知更改,首先只有1个form标签,然后我使用jinja2引擎调用login中的form.action,是此login页的第二个当有login请求(最初打开此页面)并接受带有凭据的表单HTML请求时,处理服务GET POST

然后我将路线更改为此:

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user_name = request.form['username']
        password = request.form['password']
        print(user_name, password)  # do something here?
        return redirect(url_for('session'))
    return render_template('login.html')


@app.route('/session')
def session():
    return render_template('session.html')

请注意,现在login接受两种方法,GETPOST,如前所述,GET用于提供HTML内容和{{1} }用于提交POST数据。在form端点中,我有一个条件要检查,如果它是一个login方法请求,则我要从POST中提取凭证详细信息,然后执行某些操作(例如在该print()语句中{ {1}}返回重定向(url_for('session'))`。

这是通过单击页面之一上的提交来管理从一个页面到另一页面的重定向的方法。

原始答案不正确

在Flask中进行重定向,您可以这样:

request.form

这会将您重定向到您将提供的特定端点。在docs中,有更多信息。

相关问题