2010-09-10 5 views
52

Ich ändere den Login von Flaskr Beispiel App, die erste Zeile Fehler bekommen. Aber www.html ist in der Vorlage dir.Flask Fehler: werkzeug.routing.BuildError

return redirect(url_for('www')) 
#return redirect(url_for('show_entries')) 

Anzeigefehler:

werkzeug.routing.BuildError 

BuildError: ('www', {}, None) 

Dank für die Hilfe!

Antwort

117

return redirect(url_for('www')) funktionieren würde, wenn Sie eine Funktion irgendwo anders aussehen:

@app.route('/welcome') 
def www(): 
    return render_template('www.html') 

url_for für eine Funktion aussieht, können Sie es der Namen übergeben der Funktion, die Sie anrufen wollen, sind. Betrachten Sie es wie folgt aus:

@app.route('/login') 
def sign_in(): 
    for thing in login_routine: 
     do_stuff(thing) 
    return render_template('sign_in.html') 

@app.route('/new-member') 
def welcome_page(): 
    flash('welcome to our new members') 
    flash('no cussing, no biting, nothing stronger than gin before breakfast') 
    return redirect(url_for('sign_in')) # not 'login', not 'sign_in.html' 

Sie auch return redirect('/some-url') tun könnte, wenn das leichter zu merken ist. Es ist auch möglich, dass das, was Sie wollen, gegeben Ihre erste Zeile, ist nur return render_template('www.html').

Und auch nicht aus Shuaiyuancns Kommentar unten, wenn Sie Blueprints verwenden, sollte url_for als url_for(blueprint_name.func_name) aufgerufen werden. See documentation here.

+0

ich sehe, wirklich danke bvmou veru viel. – chenge

+12

+1 für ein sehr klares Beispiel ... und für "nichts stärker als Gin vor dem Frühstück" –

+0

Erleuchtung! Ich dachte, dass das Argument die URL ist. – swdev

1

Angenommen, dass def www(): bereits definiert ist (wie von der unmounted Antwort vorgeschlagen), kann dieser Fehler auch ausgelöst werden, wenn Sie einen Blueprint verwenden, der nicht registriert wurde.

Achten Sie darauf, diese zu registrieren, wenn app zum ersten Mal instanziiert wird. Für mich ist es wie dies geschehen war:

from project.app.views.my_blueprint import my_blueprint 
app = Flask(__name__, template_folder='{}/templates'.format(app_path), static_folder='{}/static'.format(app_path)) 
app.register_blueprint(my_blueprint) 

Und innerhalbmy_blueprint.py:

from flask import render_template, Blueprint 
from flask_cors import CORS 

my_blueprint = Blueprint('my_blueprint', __name__, url_prefix='/my-page') 
CORS(my_blueprint) 


@metric_retriever.route('/') 
def index(): 
    return render_template('index.html', page_title='My Page!')