Smit
Smit

Reputation: 1

SQL error related with Flask authentication

My pip list contains :

bcrypt 3.2.0

cffi 1.15.0

click 8.0.3

colorama 0.4.4

dnspython 2.2.0

email-validator 1.1.3

Flask 2.0.3

Flask-Bcrypt 0.7.1

Flask-Login 0.5.0

Flask-SQLAlchemy 2.5.1

Flask-WTF 1.0.0

greenlet 1.1.2

idna 3.3

itsdangerous 2.0.1

Jinja2 3.0.3

MarkupSafe 2.0.1

pip 22.0.3

psycopg2 2.9.3

pycparser 2.21

python-dotenv 0.19.2

setuptools 47.1.0

six 1.16.0

SQLAlchemy 1.4.31

Werkzeug 2.0.3

WTForms 3.0.1

My module.py code is as follows :

from enum import unique
from wsgiref.validate import validator
from flask import Flask, render_template, url_for, redirect
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from flask_wtf import FlaskForm
from wtforms import StringField , PasswordField, SubmitField 
from wtforms.validators import InputRequired, Length, ValidationError
from flask_bcrypt import Bcrypt

app = Flask(__name__)



app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:password@localhost/auth'
app.config['SECRET_KEY'] = '12345'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
bcrypt = Bcrypt(app)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(20), nullable = False, unique = True)
    password = db.Column(db.String(80), nullable = False)

class RegisterForm(FlaskForm):
    username = StringField(validators = [InputRequired(), Length(min = 4, max = 20)], render_kw = {"placeholder" : "Username"})
    password = PasswordField(validators = [InputRequired(), Length(min = 4, max = 80)], render_kw = {"placeholder" : "Password"})
    submit = SubmitField("Register")

    def validate_username(self, username):
        existing_username = User.query.filter_by(username = username.data).first()
        if existing_username :
            raise ValidationError(
                "Username already Exists."
            )
class LoginForm(FlaskForm):
    username = StringField(validators = [InputRequired(), Length(min = 4, max = 20)], render_kw = {"placeholder" : "Username"})
    password = PasswordField(validators = [InputRequired(), Length(min = 4, max = 80)], render_kw = {"placeholder" : "Password"})
    submit = SubmitField("Register")



@app.route('/')
def home():
    return render_template('home.html')



@app.route('/login', methods=['GET', 'POST'])
def login():

    form = LoginForm()

    return render_template('login.html', form = form)




@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()

    if form.validate_on_submit():
        hashed_pass = bcrypt.generate_password_hash(form.password.data)
        new_user = User(username = form.username.data , password = hashed_pass)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))

    return render_template('register.html', form = form)

The database connection was successful and i did manage to create the table but, every time I am tryin to register a user it is giving me the following error :

Error :

Traceback (most recent call last):
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1802, in _execute_context
    self.dialect.do_execute(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.StringDataRightTruncation: value too long for type character varying(80)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 2091, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 2076, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 2073, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 1518, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 1516, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\flask\app.py", line 1502, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\KIIT\Desktop\login\module.py", line 69, in register
    db.session.commit()
  File "<string>", line 2, in commit

  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1431, in commit
    self._transaction.commit(_to_root=self.future)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 829, in commit
    self._prepare_impl()
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 808, in _prepare_impl
    self.session.flush()
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 3363, in flush
    self._flush(objects)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 3503, in _flush
    transaction.rollback(_capture_exception=True)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\util\compat.py", line 207, in raise_
    raise exception
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 3463, in _flush
    flush_context.execute()
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\unitofwork.py", line 456, in execute
    rec.execute(self)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\unitofwork.py", line 630, in execute
    util.preloaded.orm_persistence.save_obj(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\persistence.py", line 244, in save_obj
    _emit_insert_statements(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\orm\persistence.py", line 1221, in _emit_insert_statements
    result = connection._execute_20(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1614, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 325, in _execute_on_connection
    return connection._execute_clauseelement(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1481, in _execute_clauseelement
    ret = self._execute_context(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1845, in _execute_context
    self._handle_dbapi_exception(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2026, in _handle_dbapi_exception
    util.raise_(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\util\compat.py", line 207, in raise_
    raise exception
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1802, in _execute_context
    self.dialect.do_execute(
  File "C:\Users\KIIT\Desktop\login\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DataError: (psycopg2.errors.StringDataRightTruncation) value too long for type character varying(80)

[SQL: INSERT INTO "user" (username, password) VALUES (%(username)s, %(password)s) RETURNING "user".id]
[parameters: {'username': 'Smit', 'password': b'$2b$12$5.6IXlfuvbnQoF9HyAi0Fe/6J/r4pwsAQLW5i0os0VybmN9fAk/j2'}]
(Background on this error at: https://sqlalche.me/e/14/9h9h)

Upvotes: 0

Views: 217

Answers (1)

Smit
Smit

Reputation: 1

Update :

ok i fixed this error by converting my password with

        hashed_pass = hashed_pass.decode("utf-8", "ignore")

before adding it into my db

Upvotes: 0

Related Questions