由于Heroku上的utf-8验证错误而无法注册新用户

时间:2019-02-25 09:11:01

标签: python heroku flask utf-8 flask-wtforms

我已经在heroku上部署了flask应用程序,但是在尝试注册新用户时遇到UTF-8验证错误。本地一切正常,所以我不知道是什么原因造成的。

enter image description here

这是我的路线代码:

# 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
    }

1 个答案:

答案 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()},现在工作正常。