sqlite3.IntegrityError UNIQUE constraint failed: user.username
Opened this issue · 0 comments
When choosing a Username that is already in use I get an error that points to the routes.py file. The error points to line 90 "db.session.commit()" inside the "def account(): " shown below.
`import secrets, os
from PIL import Image
from flask import render_template, url_for, flash, redirect, request
from flaskblog import app, db, bcrypt
from flask_login import login_user, current_user, logout_user, login_required
from flaskblog.forms import RegistrationForm, LoginForm, UpdateAccountForm
from flaskblog.models import User, Post
posts = [
{
'author': 'Ethan,
'title': 'Seeds',
'comment': 'Book about seeds',
'date_post': '11/12/2021'
}
]
@app.route("/") # this is the route decorator.
@app.route("/home")
def home():
return render_template ('home.html', title = 'Home', posts=posts)
@app.route("/about") # this is the route decorator.
def about():
return render_template ('about.html', title = 'About',)
@app.route("/register", methods=[ 'GET','POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username=form.username.data, email=form.email.data, password=hashed_password)
db.session.add(user)
db.session.commit()
flash(f'Your account has been created for {form.username.data}! You are now able to log in.', 'success')
return redirect(url_for('login'))
return render_template('register.html', title = 'Register', form=form)
@app.route("/login", methods=[ 'GET','POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and bcrypt.check_password_hash(user.password, form.password.data):
login_user(user, remember=form.remember.data)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('home'))
else:
flash('Login unsuccessful, please check username and password.', 'danger')
return render_template('login.html', title = 'Login', form=form)
@app.route("/logout")
def logout():
logout_user()
return redirect(url_for('home'))
def save_picture(form_picture):
random_hex = secrets.token_hex(8)
# the "_" below discards the information provided the only info collected is the extension.
_, f_ext = os.path.splitext(form_picture.filename)
picture_fn = random_hex + f_ext
picture_path = os.path.join(app.root_path, 'static/profile_pics', picture_fn)
output_size = (125,125)
i = Image.open(form_picture)
i.thumbnail(output_size)
i.save(picture_path)
return picture_fn
@app.route("/account", methods=[ 'GET','POST'])
@login_required
def account():
form = UpdateAccountForm()
if form.validate_on_submit():
if form.picture.data:
picture_file = save_picture(form.picture.data)
current_user.image_file = picture_file
# current_user.username, current_user.email = form.username.data, form.email.data
current_user.username = form.username.data
current_user.email = form.email.data
db.session.commit()
flash('Your account has been updated!', 'success')
return redirect(url_for('account'))
elif request.method =='GET': # the purpose is to auto populate the webform with existing values.
form.username.data = current_user.username
form.email.data = current_user.email
image_file = url_for('static', filename='profile_pics/' + current_user.image_file)
return render_template('account.html', title = 'Account', image_file=image_file, form=form)`