Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sqlite3.IntegrityError UNIQUE constraint failed: user.username #169

Open
ShaneSibbett opened this issue Nov 24, 2021 · 0 comments
Open

sqlite3.IntegrityError UNIQUE constraint failed: user.username #169

ShaneSibbett opened this issue Nov 24, 2021 · 0 comments

Comments

@ShaneSibbett
Copy link

ShaneSibbett commented Nov 24, 2021

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)`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant