【问题标题】:Getting werkzeug.routing.BuildError获取 werkzeug.routing.BuildError
【发布时间】:2014-09-03 06:48:47
【问题描述】:

当我转到“login.html”页面时,我收到了 werkzeug.routing.BuildError。问题似乎是模板中的“action=”属性。原来是action={{url_for('login')}}。尽管docs show it done this way 似乎不起作用。当我将其更改为 action="/login"action="#" 时,它可以正常工作。问题是为什么?我的印象是正确的方法是action={{url_for('login')}}

在我将代码分解成包(单个 py 文件中的所有内容)之前,它可以正常工作。

顺便说一句,大部分代码来自 Miguel Grindberg 的《Flask Web Development》一书。我遇到问题的代码是我自己在书中添加的。我在 WinXP 上并使用最新的 Flask。下面是我的代码:

flasky\app\main\views.py:

from flask import render_template, session, redirect, url_for, current_app, flash
from .. import db
from ..models import User
from ..email import send_email, post_mail
from . import main
from .forms import NameForm, RegForm


@main.route('/login', methods=['GET', 'POST'])
def login():
    form = RegForm()
    if form.validate_on_submit():
        session['name'] = form.username.data
        session['logged_in'] = True
        return redirect(url_for('success'))
    return render_template('login.html', form=form)

flasky\app\templates\login.html:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Sign Up{% endblock %}


{% block content %}
    {{ super() }}

    <div class="well">
        <h1 align="center">Sign-In</h1>
    </div>

    <div class="container"> 
        <form class="form form-horizontal" action="{{url_for('login')}}" method="post">
            {{form.hidden_tag()}}

            {{wtf.form_field(form.username)}}

            {{wtf.form_field(form.email)}}

            {{wtf.form_field(form.password)}}

            {{wtf.form_field(form.bool)}}

            {{wtf.form_field(form.submit)}}
        </form>
    </div>  
{% endblock %}

<!-- action= {{url_for('login')}} doesn't work. . ."#" and "\login" work-->

flasky\app\main\forms.py:

from flask.ext.wtf import Form
from wtforms import StringField, SubmitField, PasswordField, BooleanField, SubmitField
from wtforms.validators import Required, Email

class RegForm(Form):
    username = StringField('Username', validators=[Required()])
    email = StringField('Email Address', validators=[Email()])
    password = PasswordField('Password', validators=[Required()])
    bool = BooleanField("I Agree To Your Terms of Services", validators=[Required()])
    submit = SubmitField('Submit')

【问题讨论】:

    标签: python python-2.7 flask


    【解决方案1】:

    url_for() 方法无法找到符合描述的端点时,会引发BuildError。在这种情况下,没有发现 login 端点注册到 Flask app 对象。

    您似乎已经使用名为main蓝图 注册了login 路由;您需要在端点名称中使用蓝图名称:

    {{ url_for('main.login') }}
    

    如果模板仅被 main 蓝图中的路由使用,您也可以通过以 . 开头的名称使其相对:

    {{ url_for('.login') }}
    

    请参阅蓝图文档的 Building URLs section

    【讨论】:

    • 完成!顺便说一句,如果我离开它“action='\login'”,从长远来看,即使它呈现了模板,这是否行不通?
    • \ 开头的路径无效,您应该使用/login;并且由于您有蓝图,您可能会将蓝图的路径从 / 更改为 /main/ 或其他任何内容,从而破坏您的硬编码路径。
    • 糟糕,我的意思是“/login”,抱歉。无论如何,我明白了,再次感谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多