1

I need some help here, please. I just can't get this code to insert data from an HTML form into MySQL. The rows are always inserted without any data. Completely empty. Let me know your thoughts!

PS: MySql has 2 more fields, which I am not using yet and these files are all hosted on PythonAnywhere.

HTML (Only the form):

<form action="{{ url_for('register_user') }}" method="post">
    <div class="register-form">

        <input type="text" class="register-field" id="firstname" value="" placeholder="First name" name="firstname">
        <label class="register-field-icon fui-user" for="register-name"></label>

        <input type="text" class="register-field" id="lastname" value="" placeholder="Last name" name="lastname">
        <label class="register-field-icon fui-user" for="register-name"></label>

        <input type="text" class="register-field" id="email" value="" placeholder="Email" name="email">
        <label class="register-field-icon fui-user" for="register-name"></label>

        <input type="password" class="register-field" id="password" value="" placeholder="Password" name="password">
        <label class="register-field-icon fui-lock" for="register-pass"></label>

        <label class="register-field-icon fui-lock" for="register-pass"></label>
        <input type="submit" value="Register" id="register-btn" class="btn register-btn">

    </div>
</form>

FLASK (without the connection details for MySql):

from datetime import datetime
from flask import Flask, redirect, render_template, request, url_for, session
from flask_login import current_user, login_required, login_user, LoginManager, logout_user, UserMixin
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import check_password_hash
from flask import session as login_session


@app.route("/register/", methods=["GET", "POST"])
    def register_user():
    if request.method == "GET":
        return render_template("register.html")

    else:

        User_Data = Reg_User(firstname=request.form["firstname"],lastname=request.form["lastname"],email=request.form["email"],password_hash=request.form["password"])#,groups="freeuser")
        db.session.add(User_Data)
        db.session.commit()

        return redirect(url_for('login'))



class Reg_User(db.Model):

    __tablename__ = 'users'

    def __init__(self, firstname, lastname, email, password_hash):#, groups):

        id = db.Column(db.Integer, primary_key=True)
        firstname = db.Column(db.String(20), unique=False, nullable=False)
        lastname = db.Column(db.String(45), unique=False, nullable=False)
        email = db.Column(db.String(45), unique=True, nullable=False)
        password_hash = db.Column(db.String(128), unique=False, nullable=False)


    def __repr__(self):
        return '<Reg_User %r>'.format(self.username)

MYSQL:

+--------------------------------------------------------------------------

|  id  |  username  |  password_hash  |  firstname  |  lastname  |  email  |   groups  |  regtime  |

+--------------------------------------------------------------------------

|  43  |     NULL     |          NULL           |     NULL      |     NULL     |  NULL  |   NULL   |  2019-01-09 22:00:56 |

|  44  |     NULL     |          NULL           |     NULL      |     NULL     |  NULL  |   NULL   |  2019-01-09 22:55:09 |

|  45  |     NULL     |          NULL           |     NULL      |     NULL     |  NULL  |   NULL   |  2019-01-09 23:04:15 |

|  46  |     NULL     |          NULL           |     NULL      |     NULL     |  NULL  |   NULL   |  2019-01-09 23:10:32 |

1 Answer 1

3

You are creating and using your model class incorrectly.

You don't actually need __init__ at all in your case. Also, you are doing some incorrect things in your constructor, a short refresher tutorial on Python classes wouldn't hurt here.

Here is a User model pattern you can follow

You do not need to define __init__

class User(db.Model):
    """Users"""

    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    first_name = db.Column(db.String(25), nullable=False)
    last_name = db.Column(db.String(25), nullable=False)
    image_url = db.Column(db.Text, default=DEFAULT_IMG_URL)
    email = db.Column(db.String(45), unique=True, nullable=False)
    password = db.Column(db.String(128), unique=False, nullable=False)

    def __repr__(self):
        return f'<User id:{self.id} first_name:{self.first_name} last_name:{self.last_name} image_url:%.8s' % self.image_url

    def get_full_name(self):
        return f'{self.first_name} = {self.last_name}'

You can create a new user by creating an instance of the model then committing to the database

@app.route("/register/", methods=["GET", "POST"])
    def register_user():
    if request.method == "GET":
        return render_template("register.html")

    else:
        first_name = request.form.get('first_name')
        last_name = request.form.get('last_name') 
        email = request.form.get('email')
        password = request.form.get('password')

        # hash your password, this is a separate topic
        hashed = bcrypt.generate_password_hash(password).decode('utf-8')

        user = User(first_name=first_name, last_name=last_name, email=email, password=hashed)

        db.session.add(user)
        db.session.commit()

        return redirect(url_for('login'))
Sign up to request clarification or add additional context in comments.

1 Comment

Perfect. Thank you. I just had to add "table_args = {'extend_existing': True}", because of another class (login) not pasted in this question. Helped a lot!

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.