werkzeug.routing.BuildError: Не удалось создать URL для конечной точки «success».Вы забыли указать значения ['name']? - PullRequest
0 голосов
/ 29 января 2019

"werkzeug.routing.BuildError: Не удалось создать URL для конечной точки 'success'. Вы забыли указать значения ['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 и версию колбы 1.0.2.

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Вам нужно добавить в 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)
0 голосов
/ 16 июля 2019

Вы пытаетесь получить доступ к логину напрямую.Сначала вы должны открыть 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"
0 голосов
/ 30 января 2019

Посмотрите на это.В вашей функции входа в систему я добавил render_template для первого запроса GET при открытии страницы входа.Это, вероятно, также предотвратит ошибку, которую вы получаете сейчас.Имейте в виду, что это не содержит обработки ошибок, например, что происходит, если пользователь неизвестен в вашей процедуре входа в систему.

@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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...