Невозможно зарегистрировать нового пользователя из-за ошибки проверки utf-8 на heroku - PullRequest
0 голосов
/ 25 февраля 2019

Я установил приложение на флешку на heroku, но при регистрации нового пользователя я сталкиваюсь с ошибкой проверки 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 , но не смог найти никаких ошибок.

EDIT Вот код для проверки пароля:

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 голосов
/ 25 февраля 2019

После еще нескольких копаний я наконец нашел проблему.Это было в моей функции 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

Я добавил yield {unicode(key, 'utf-8'):unicode(value, 'utf-8') for key, value in row.iteritems()} после первого оператора для , и теперь он работает нормально.

...