我已经在heroku上部署了flask应用程序,但是在尝试注册新用户时遇到UTF-8验证错误。本地一切正常,所以我不知道是什么原因造成的。
这是我的路线代码:
# REGISTER
@bp.route('/register', methods = ['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = RegistrationForm()
if form.validate_on_submit():
user = User(username = form.username.data)
password = form.password.data
password_validation = password_check(password)
if not password_validation['password_ok']:
flash("Votre mot de passe n'est pas sécurisé !")
if password_validation['length_error']:
flash("Votre mot de passe doit comporter au moins 8 caractères !")
if password_validation['digit_error']:
flash("Votre mot de passe doit comporter au moins 1 chiffre !")
if password_validation['uppercase_error']:
flash("Votre mot de passe doit comporter au moins 1 majuscule !")
if password_validation['lowercase_error']:
flash("Votre mot de passe doit comporter au moins 1 minuscule !")
if password_validation['symbol_error']:
flash("Votre mot de passe doit comporter au moins 1 caractère spécial !")
return redirect(url_for('auth.register'))
user.set_password(password)
user.send_confirmation_email = datetime.now()
db.session.add(user)
db.session.commit()
send_confirmation_email(user.username)
flash('Félicitations, vous êtes désormais enregistré ! Veuillez consulter vos mails pour confirmer votre adresse mail !')
return redirect(url_for('auth.login'))
return render_template('auth/register.html', title = 'Inscription', form = form)
这是我的表单代码:
class RegistrationForm(FlaskForm):
username = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Mot de passe', validators=[DataRequired()])
password2 = PasswordField(
'Confirmation du mot de passe', validators=[DataRequired(), EqualTo('password')])
recaptcha = RecaptchaField()
submit = SubmitField('S\'enregistrer')
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
is_client = client_mail(username.data)
if is_client == False:
raise ValidationError('Nous sommes désolé mais vous n\'êtes pas l\'un de nos clients.')
if user is not None:
if not user.email_confirmed:
send_confirmation_email(user.username)
raise ValidationError('Une nouveau mail de confirmation vous a été envoyé.')
else:
raise ValidationError('Cette addresse mail est déjà utilisée, veuillez en saisir une nouvelle.')
任何人都知道这是什么问题? 我查看了 heroku logs --tail 命令,但找不到任何错误。
编辑 这是检查密码的代码:
def password_check(password):
length_error = len(password) < 8
digit_error = re.search(r"\d", password) is None
uppercase_error = re.search(r"[A-Z]", password) is None
lowercase_error = re.search(r"[a-z]", password) is None
symbol_error = re.search(r"\W", password) is None
password_ok = not (length_error or digit_error or uppercase_error or lowercase_error or symbol_error)
return {
'password_ok': password_ok,
'length_error': length_error,
'digit_error': digit_error,
'uppercase_error': uppercase_error,
'lowercase_error': lowercase_error,
'symbol_error': symbol_error
}
答案 0 :(得分:0)
经过进一步的挖掘,我终于找到了问题所在。
这是在我的client_mail()
函数中:我正在读取没有任何编码选项的CSV文件。
with open(csv_file) as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
for (key, val) in row.items():
if client_company in val:
is_client = True
我在第一个 for 语句后添加了yield {unicode(key, 'utf-8'):unicode(value, 'utf-8') for key, value in row.iteritems()}
,现在工作正常。