0

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)
1
  • You should use a binary column type for the password column. See this answer for some discussion. Commented Feb 17, 2022 at 14:43

1 Answer 1

0

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.