Python Flask «werkzeug.routing.BuildError «после переименования html-файла в папке templates

#python #flask

#python #flask

Вопрос:

мой сервер flask ведет себя действительно странно, у меня был такой маршрут

 @app.route('/login' , methods=['GET' , 'POST'])
def register():
    return render_template('login.html')
  

это сработало отлично и дало мне страницу, когда я ее запросил
но затем я переименовал имя файла в «register.html «

 @app.route('/register' , methods=['GET' , 'POST'])
def register():
    return render_template('register.html')
  

и теперь это выдает мне ошибку: werkzeug.routing.Ошибка BuildError: не удалось создать URL для конечной точки ‘/ register’. Вы имели в виду «зарегистрироваться» вместо этого?

Теперь я несколько раз пытался изменить маршрут с разными именами:

 @app.route('/anypathname' , methods=['GET' , 'POST'])
def register():
    return render_template('register.html')
  

это ВСЕ ЕЩЕ выдает мне ошибку: werkzeug.routing.Ошибка BuildError: не удалось создать URL-адрес для конечной точки ‘/ register’. Вы имели в виду «зарегистрироваться» вместо этого?

разве в этой ошибке не должно быть написано «werkzeug.routing.Ошибка BuildError: не удалось создать URL для конечной точки ‘/ anypathname’. Вы имели в виду ‘anypathname’ вместо этого?»

я попытался перезапустить сервер, очистить кэш браузера, и flask автоматически перезагружается при изменении кода, его отладчик тоже работает. но это все еще выдает мне эту ошибку

Комментарии:

1. Может быть, вы использовали url_for и передали путь вместо конечной точки?

2. @Detlef я написал это, когда имя моего файла было «login.html » в функции route: return redirect(url_for('home'))

3. В этом коде нет ошибки. Ошибка может быть вызвана не маршрутом, а шаблоном. Извините, я узнаю об этой ошибке только из-за неправильных параметров при использовании url_for или повторяющихся имен для конечных точек. Может ли сообщение об ошибке указывать, в какой области возникает ошибка?

4. @Detlef я создал новый HTML-файл под названием «registerAccount.html «скопировал код из «register.html » и поместил его в параметр renderTemplate, но он все равно не сработал.

5. я не могу понять журналы ошибок

Ответ №1:

Это мой простой пример регистрации пользователя. Код немного сокращен из-за длины. Возможно, это вам немного поможет.

 from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField

from wtforms.validators import InputRequired, Length, EqualTo, Regexp, Email
from wtforms.validators import ValidationError

class RegistrationForm(FlaskForm):
    username = StringField(
        'Username',
        validators=[
            InputRequired(),
            Length(3,20),
            Regexp(
                '^[A-Za-z][A-Za-z0-9_.]*$',
                message='Username must have only letters, numbers, dots or underscores.')
        ],

    )
    email = StringField(
        'E-Mail',
        validators=[
            InputRequired(),
            Email()
        ],
    )
    password = PasswordField(
        'Password',
        validators=[
            InputRequired(),
            EqualTo('password_confirm',
                message='Password confirmation invalid.')
        ],
    )
    password_confirm = PasswordField(
        'Password Confirmation',
        validators=[
            InputRequired(),  
        ],
    )
    submit = SubmitField('Register')

    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Email already registered.')

    def validate_username(self, field):
        if User.query.filter(User.username.ilike(field.data)).first():
            raise ValidationError('Username already in use.')
  
 @app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm(request.form)
    if form.validate_on_submit():
        try:
            user = User()
            form.populate_obj(user)
            db.session.add(user)
            db.session.commit()
        else:
            flash("Your user has been created, please login.", category="success")
            return redirect(url_for('auth.login'))
    return render_template('register.html', form=form)

# ... (login, etc.)
  
 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Flask App</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP VmmDGMN5t9UJ0Z" crossorigin="anonymous">
  </head>
  <body>
    <form method="POST">
      {{ form.csrf_token }}
      <div class="form-group">
      {{ form.email.label() }}
      {{ form.email(class='form-control') }}
      </div>
      <div class="form-group">
      {{ form.username.label() }}
      {{ form.username(class='form-control') }}
      </div>
      <div class="form-group">
      {{ form.password.label() }}
      {{ form.password(class='form-control') }}
      </div>
      <div class="form-group">
      {{ form.password_confirm.label() }}
      {{ form.password_confirm(class='form-control') }}
      </div>
      {{ form.submit(class='btn btn-primary btn-block') }}
    </form>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C OGpamoFVy38MVBnE IbbVYUew OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU 6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV rV" crossorigin="anonymous"></script>
  </body>
</html>
  

Ответ №2:

я указывал на «/ register» в ссылке тега «a» в «register.html » но это должно быть «register», а не «/ register»

  <a href="{{ url_for('register') }}"><button class="login-btn">Register</button></a>

not:

 <a href="{{ url_for('/register') }}"><button class="login-btn">Register</button></a>
```html