werkzeug.routing.BuildError:无法为端点“成功”构建URL。您是否忘记了指定值['name']?

时间:2019-01-29 09:29:12

标签: python flask

  

“ werkzeug.routing.BuildError:无法为端点“成功”构建URL。您是否忘记了指定值['name']?”

如何解决此错误?我已经尝试了很多事情,但我自己无法解决。

http_methods.py:

from flask import Flask, redirect, url_for, request
app = Flask(__name__)

@app.route('/success/<name>')
def success(name):
    return 'welcome %s' % name

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        user = request.form['nm']
        return redirect(url_for('success', name = user))
    else:
        user = request.args.get('nm')
        return redirect(url_for('success', name = user))

if __name__ == "__main__":
    app.run(debug=True)

我在登录方法中遇到错误,未指定['name']的值;如何解决此错误?

login.html:

<!DOCTYPE html>
<html lang="en">
    <body>
        <form action="http://127.0.0.1:5000/login" method="POST">
            <p>Enter name:</p>
            <p><input type="text" name="nm" value="nm"/></p>
            <p><input type="submit" value="submit"/></p>    
        </form>
    </body>
</html>

输出:

  File "/Users/chirag.kanzariya/pythonprojects/v_python/lib/python3.7/site-packages/flask/helpers.py", line 345, in url_for
    force_external=external)
  File "/Users/chirag.kanzariya/pythonprojects/v_python/lib/python3.7/site-packages/werkzeug/routing.py", line 1776, in build
    raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'success'. Did you forget to specify values ['name']?
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 -
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=ubuntu.ttf HTTP/1.1" 200 -
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -
127.0.0.1 - - [29/Jan/2019 14:48:00] "GET /login?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -

我现在正在使用python 3.7和flask 1.0.2版本。

5 个答案:

答案 0 :(得分:1)

您需要在其他(GET)部分中添加用于登录的html代码。

from flask import Flask, request, render_template, redirect, url_for
app = Flask(__name__)

@app.route('/success/<name>')
def success(name):
    return 'welcome %s' % name

@app.route('/login',methods = ['POST', 'GET'])
def login():
    if request.method == 'POST':
        user = request.form['nm']
        return redirect(url_for('success',name = user))
    else:
        return render_template('login.html')

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

答案 1 :(得分:0)

看看这个。在您的登录功能中,打开登录页面时,我为第一个GET请求添加了render_template。这也可能会避免您现在遇到的错误。 请记住,它不包含任何错误处理,例如在登录过程中未知用户时会发生什么。

@app.route('/success/<name>')
def success(name):
    return 'welcome %s' % name

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        user = request.form['nm']
        return redirect(url_for('success', name = user))

    return render_template(login.html)

if __name__ == "__main__":
    app.run(debug=True)

答案 2 :(得分:0)

您正尝试直接访问登录名。您首先必须打开html页面。然后它访问值。 尝试此修复程序,然后先打开html页面

@app.route('/login',methods=["POST","GET"])
def login():
    if request.method=="POST":
        user=request.form["nm"]
    else:
        user=request.args.get("nm")
    if user:
        return redirect(url_for('success', name = str(user)))
    else:
        return "go to the form"

答案 3 :(得分:0)

您的代码没有错,您需要做的只是导航到包含.py代码的文件夹和包含表单的html文件(确保它们位于同一文件夹中),然后运行html文件,完成表单并提交。服务器使用传递的链接来处理python代码和html代码之间的连接。希望能对您有帮助。我在同一个问题上作了斗争,所有建议的响应仅在您首先运行html代码而不是.py脚本的情况下才起作用。

答案 4 :(得分:0)

此代码源自的教程存在逻辑缺陷,由最初的两个贡献者gitterteduardosufan进行标识和纠正。这也让我感到烦恼,但是直到我遇到这个Stack Overflow问题,并确认了后者之后,我才知道是我对Flask的理解不够,还是本教程确实存在问题。

具体来说,该逻辑最初会检查POST请求。如果不是那样,则假定GET-并且至关重要的是,还要 nm的值。缺陷在于:如果用户尚未输入名称,则其值将为None,Werkzeug不能为其创建路线,这甚至阻止了页面加载-鸡肉和鸡蛋。 / p>