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



"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'] 的值;如何解决此错误?

登录.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版本。

看看这个。在您的登录功能中,我在打开登录页面时为第一个 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)

您需要在 else 部分 (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)

这段代码来源的教程有一个逻辑缺陷,由最初的两个贡献者 gittert 和 eduardosufan 识别和纠正。 这也让我很烦恼,但我无法弄清楚这是否只是我对 Flask 的理解不足,或者教程是否真的存在问题,直到我遇到了这个 Stack Overflow 问题,这证实了后者。

具体而言,逻辑最初检查POST请求。 如果不是这样,它假设GET - 而且至关重要的是,还有nm的价值。 这是一个缺陷:如果用户尚未输入名称,则其值将为 None ,Werkzeug 无法为其创建路由,这甚至会阻止页面加载 - 鸡和蛋。

正在呈现的 HTML 文件中的锚标记应引用它被定向到的函数。例如,按照下面的代码片段,如果我们想在 HTML 中引用索引,烧瓶应用程序"app.py"必须包含一个名为 index 的函数。

添加了关于函数来阐明我的意思。

from flask import Flask, render_template
app = FLASK(__name__)
@app.route('/')
def index():
    return render_template('home.html')
@app.route('/')
def about():
    return render_template('about.html')

<a href="{{url_for('index')}}">Index</a>
to 
<a href="{{url_for('about')}}">Index</a>

您正在尝试直接访问登录名。您首先必须打开 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"

您的代码没有问题,您需要做的就是导航到包含.py代码的文件夹和包含表单的 html 文件(确保它们位于同一文件夹中)并运行 html 文件,填写表单并提交。 服务器使用操作中传递的链接来处理 Python 代码和 HTML 代码之间的连接。我希望它有所帮助。我遇到了同样的问题,所有建议的响应只有在您首先运行 html 代码而不仅仅是.py脚本时才有效。

对于作为模块的蓝图路由,检查 HTML 模板中的url_for函数

<a href="{{url_for('index')}}">Index</a>
to 
<a href="{{url_for('auth.index')}}">Index</a>

相关内容

最新更新