Reputation: 19
I am new to using flask for backend, and am facing an issue with storing sessions using memcached. I installed Memurai and connected to it and it was working fine. In my app. The login route apparently works fine and through thunderclient i can see a cookie being generated when user is logged in using correct credentials. However, error occurs when I visit the route /me
, where I am constantly getting a 401 unauthorized error. Upon inspection using print commands (at line 44 and 45 of app.py
), I can see that Session Data: <MemcachedSession {}>
User ID: None
, which prolly means the session is not storing any data.
Here are my codes for app.py, config.py and models.py. I'd really appreciate if anyone helps me with this issue.
app.py:
from flask import Flask, request, jsonify, session
from flask_bcrypt import Bcrypt
from config import ApplicationConfig
from flask_session import Session
from models import db, User
app = Flask(__name__)
app.config.from_object(ApplicationConfig)
bcrypt = Bcrypt(app)
flask_session = Session(app)
db.init_app(app)
with app.app_context():
db.create_all()
@app.route("/register", methods=["POST"])
def register_user():
email = request.json["email"]
password = request.json["password"]
user_exists = User.query.filter_by(email=email).first() is not None
if(user_exists):
return jsonify({
"error": "User already Exists"
}), 409
hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
new_user = User(email=email, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return jsonify({
"id":new_user.id,
"email":new_user.email
})
@app.route("/me")
def get_user():
user_id = session.get("user_id")
print("Session Data:", session)
print("User ID:", user_id)
if not user_id:
return jsonify({"error":"Unauthorized"}), 401
user = User.query.filter_by(id=user_id).first()
return jsonify({
"id":user.id,
"email":user.email
})
@app.route("/login", methods=["POST"])
def login_user():
email = request.json["email"]
password = request.json["password"]
user = User.query.filter_by(email=email).first()
if user is None:
return jsonify({"error":"User Not Found"}), 401
if not bcrypt.check_password_hash(user.password, password):
return jsonify({"error":"Invalid Password"}), 401
session["user_id"] = user.id
return jsonify({
"id": user.id,
"email": user.email
})
if __name__ == "__main__":
app.run(debug=True)
config.py file:
from dotenv import load_dotenv
import os
load_dotenv()
class ApplicationConfig:
SECRET_KEY = os.environ["SECRET_KEY"]
SQLALCHEMY_TRACK_MODIFICATIONS= False
SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = r"sqlite:///./db.authapp"
SESSION_TYPE= 'memcached'
SESSION_PERMANENT = False
SESSION_USER_SIGNER = True
MEMCACHED_SERVER = ['127.0.0.1:6379']
models.py:
from flask_sqlalchemy import SQLAlchemy
from uuid import uuid4
db = SQLAlchemy()
def get_uuid():
return str(uuid4())
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.String(32), primary_key = True, unique = True, default= get_uuid)
email= db.Column(db.String(345),unique=True)
password= db.Column(db.Text, nullable = False)
Upvotes: 0
Views: 89