flask 中的表单操作不重定向到路由

form action in flask not redirecting to the route

简单地说,我只是想通过在我的 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() url 上。我也试过

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

但效果不佳。不确定我错过了什么?请任何 hints/ideas 将不胜感激。

试试这个(我刚刚添加了一行,评论的那一行):

@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. 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 引擎调用 form.action 中的 login,第二个 login 页面在有 GET 请求(最初打开此页面)时处理服务 login HTML 并接受带有凭据的表单 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 内容和 POST 用于提交 form 数据。在 login 端点中,我有一个条件来检查,如果它是 POST 方法请求,那么我从 request.form 中提取凭证详细信息并在执行某些操作之后(例如在该 print() 语句中Ireturn 重定向(url_for('session'))`.

这就是您通过在其中一个页面上单击提交来管理从一个页面到另一个页面的重定向的方式。

原来的答案不正确

在 Flask 中重定向,你可以这样:

from flask import url_for, redirect

@app.route('/sessions', methods['GET', 'POST']
def sessions():
    # some code
    return redirect(url_for('some.endpoint'))

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