#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