【问题标题】:Error with POST request in FlaskFlask 中的 POST 请求出错
【发布时间】:2016-03-06 22:47:19
【问题描述】:

我的问题与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>

即使我在return redirect(url_for('login'), code=307) 调用中添加了code = 307 并且请求方法是POST,但当我单击以用户身份登录 按钮时,我收到以下错误:

错误请求

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

【问题讨论】:

    标签: python redirect post flask get


    【解决方案1】:

    原因:

    单击“以用户身份登录”-> 转到索引端点-> 重定向到登录端点。

    问题是当重定向到登录端点时,您无法通过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!"
    

    【讨论】:

    • 恐怕这个解决方案行不通。如果我从 index() 中删除代码 307,则 login() 中的 request.method 是 GET,因此不会执行 if request.method == 'POST': 中的代码。
    • 是的,只需渲染登录页面,然后您发布用户名和密码,如果正确,您将被重定向到管理页面。我有什么想念的吗?
    • if username == 'realusername' and password == 'realpasswd': redirect(url_for('success_login')) 此代码在 if 语句 if request.method == 'POST': 内。如果没有代码 307,request.method 是 GET,所以 request.method == 'POST' 是 false 并且 if 中的代码不会被执行。永远不会重定向到管理页面。
    • 索引端点的重定向第一次不会命中if语句,所以只渲染登录页面,输入用户名和密码,点击提交。这是一个 POST 请求,如果密码和用户名正确,您将重定向到管理页面,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2016-04-11
    • 2012-03-04
    • 2017-05-22
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多