user9665527
user9665527

Reputation:

How to get name of logged user (Flask, SQLAlchemy)

I want to authomaticaly put name to authors blogged from loged in session. So far I can log user but when he is already logged I cant find way to work with his name on site.

So I am trying to create some way, which will store username after he is logged in memory and flask will then use this username for blog posts and comments or editing profile. Thank you

Base = declarative_base()
class User(Base):

     __tablename__ = "users"

     id = Column(Integer, primary_key=True)
     username = Column(String(64))
     password = Column(String(120))
     email = Column(String(64))

     def __init__(self, username, password, email):

         self.username = username
         self.password = password
         self.email = email



Base.metadata.create_all(engine)

Base2 = declarative_base()
class Blogpost(Base2):

    __tablename__ = 'blogpost'

    id = Column(Integer, primary_key=True)
    title = Column(String(50))
    subtitle = Column(String(50))
    author = Column(String(20))
    date_posted = Column(DateTime)
    content = Column(Text)

    def __init__(self, title, subtitle, author, date_posted, content):

         self.title = title
         self.subtitle = subtitle
         self.author = author
         self.date_posted = date_posted
         self.content = content

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

     POST_USERNAME = str(request.form['username'])
     POST_PASSWORD = str(request.form['password'])

def check_password(hashed_password, user_password):
    password, salt = hashed_password.split(':')
    return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

Session = sessionmaker(bind=engine)
s = Session()
user = s.query(User).filter_by(username=POST_USERNAME).first()
if check_password(user.password, POST_PASSWORD) == True:
    session['logged_in'] = True
    user_name = POST_USERNAME
else:
    flash('wrong password!')
return index()

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

@app.route('/addpost', methods=['POST'])
def addpost():
     title = request.form['title']
     subtitle = request.form['subtitle']
     content = request.form['content']

     Session = sessionmaker(bind=engine)
     session = Session()
     post = Blogpost(title=title, subtitle=subtitle, author=user_name,   content=content, date_posted=datetime.now())

     session.add(post)
     session.commit() 

Upvotes: 0

Views: 2825

Answers (1)

Moses N. Njenga
Moses N. Njenga

Reputation: 771

I would encourage you to use an extension like flask-login for user management or flask-security for extended features, meanwhile, you can store the user in flask sessions.

first import session (i will call it login_session to differentiate it with your sql-alchemy session)

from flask import session as login_session

Then once a user logs in you can store the user details like this

login_session['username'] = user.username #user here being the user object you have queried

And to access the user name from session

username  = login_session['username']

and once a user logs out, you delete the user details from session like this

del login_session['username']

But as others have mentioned in the comments, for a serious web app, you will want to consider using one of the flask extensions for user management

Upvotes: 1

Related Questions