@realgord88

Как проверить уникальности Nickname в БД SQLAlchemy Flask/Python?

Нужно проверить уникальность никнема при регистрации пользователей. Попробовал такой код, не работает. Какие есть предложения, товарищи?

from flask import render_template, flash, redirect, session, url_for, request, g
from app import app, db, models
from models import User, ROLE_USER, ROLE_ADMIN
from forms import RegisterForm
import flask


@app.route('/', methods = ['GET', 'POST'])
@app.route('/index', methods = ['GET', 'POST'])
def index():
    form = RegisterForm()
    ROLE_USER = 0
    counter = 0
    nick = ''
    if form.validate_on_submit():
        user = User(nickname = form.Nickname.data, email = form.Email.data, password = form.Password.data, role = ROLE_USER)
        users = models.User.query.all()
        for u in users:
            nick = u.id,u.nickname
            if nick == form.Nickname.data:
                counter += 1
        if counter == 0:
            db.session.add(user)
            db.session.commit()
            return redirect('/')
        else:
            flash('ebat ti loh')
    return render_template('index.html',
        form = form,
        counter = counter,
        nick = nick)
  • Вопрос задан
  • 1264 просмотра
Решения вопроса 1
Сделайте unique index на атрибут nickname в модельке User. Как-то так: nickname = Column(..., unique=True)

И проверяйте так:
try:
    user = User.query.filter_by(nickname=user.nickname).one()
except NoResultFound:
    # ник уникален
    pass
else:
    # ник не уникален
    pass

p.s. Если не нужен результат результат запроса, то можно посмотреть на exists(). Не думаю, что оно критично для подобного рода задач, однако с ним выгрузки данных не происходит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gunlinux
@gunlinux
Freelancer
Пусть flask-wtf разбирается

К прочтению

class RegistrationForm(Form):
    email = StringField(u'Электронная почта',
                        validators=[Required(REQ_TEXT),
                                    Length(1, 64),
                                    Email(REQ_TEXT)])
    password = PasswordField(u'Пароль', validators=[
        Required(REQ_TEXT)])
    submit = SubmitField(u'Зарегистрироваться')

    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError(u'Почта уже занята')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы