Skip to content

Commit d33ae2b

Browse files
Update app.py
1 parent 547b417 commit d33ae2b

File tree

1 file changed

+78
-10
lines changed

1 file changed

+78
-10
lines changed

app.py

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,70 @@
1-
from flask import Flask, render_template, request, redirect, url_for, jsonify
1+
from flask import Flask, render_template, request, redirect, url_for, jsonify, flash
22
from flask_sqlalchemy import SQLAlchemy
3+
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user, login_manager
34
from datetime import datetime
45
import os
6+
57
app = Flask(__name__)
68

7-
# Configure the database
8-
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///notes.db'
9-
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
9+
# Configure the base directory for SQLite and secret key for sessions
10+
app.config['SECRET_KEY'] = 'your_secret_key'
11+
12+
# Initialize the LoginManager
13+
login_manager = LoginManager(app)
14+
login_manager.login_view = 'login'
15+
16+
# Initialize SQLAlchemy without a specific URI, as it will be set dynamically per user
1017
db = SQLAlchemy(app)
1118

12-
# Define the Note model
19+
# User model for authentication
20+
class User(UserMixin, db.Model):
21+
id = db.Column(db.Integer, primary_key=True)
22+
username = db.Column(db.String(100), unique=True, nullable=False)
23+
password = db.Column(db.String(100), nullable=False)
24+
25+
# Note model
1326
class Note(db.Model):
1427
id = db.Column(db.Integer, primary_key=True)
1528
title = db.Column(db.String(100), nullable=False)
1629
content = db.Column(db.Text, nullable=False)
1730
tags = db.Column(db.String(200), nullable=True)
1831
reminder = db.Column(db.DateTime, nullable=True)
32+
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
1933

20-
# Initialize the database
21-
with app.app_context():
22-
db.create_all()
34+
# User loader function for Flask-Login
35+
@login_manager.user_loader
36+
def load_user(user_id):
37+
return User.query.get(int(user_id))
38+
39+
# Route to login
40+
@app.route('/login', methods=['GET', 'POST'])
41+
def login():
42+
if request.method == 'POST':
43+
username = request.form['username']
44+
password = request.form['password']
45+
46+
user = User.query.filter_by(username=username).first()
47+
if user and user.password == password: # Simple check, use hashed passwords in production
48+
login_user(user)
49+
# Set user-specific database URI dynamically
50+
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///users/{username}_notes.db"
51+
with app.app_context():
52+
db.create_all() # Create tables in the user's database
53+
return redirect(url_for('home'))
54+
else:
55+
flash('Invalid credentials')
56+
return render_template('login.html')
57+
58+
# Route to log out
59+
@app.route('/logout')
60+
@login_required
61+
def logout():
62+
logout_user()
63+
return redirect(url_for('login'))
2364

2465
# Route for the home page
2566
@app.route('/')
67+
@login_required
2668
def home():
2769
query = request.args.get('search', '')
2870
if query:
@@ -34,11 +76,13 @@ def home():
3476

3577
# Route to display the create note form
3678
@app.route('/create-note')
79+
@login_required
3780
def create_note_form():
3881
return render_template('index.html')
3982

4083
# Route to create a new note
4184
@app.route('/notes', methods=['POST'])
85+
@login_required
4286
def create_note():
4387
data = request.json
4488
reminder = datetime.fromisoformat(data.get('reminder')) if data.get('reminder') else None
@@ -47,14 +91,16 @@ def create_note():
4791
title=data['title'],
4892
content=data['content'],
4993
tags=data.get('tags', ''),
50-
reminder=reminder
94+
reminder=reminder,
95+
user_id=current_user.id
5196
)
5297
db.session.add(new_note)
5398
db.session.commit()
5499
return jsonify({'message': 'Note created successfully'}), 201
55100

56101
# Route to delete a note by its ID
57102
@app.route('/notes/<int:id>', methods=['DELETE'])
103+
@login_required
58104
def delete_note(id):
59105
note = Note.query.get_or_404(id)
60106
db.session.delete(note)
@@ -63,12 +109,14 @@ def delete_note(id):
63109

64110
# Route to render the edit note form
65111
@app.route('/notes/<int:id>/edit', methods=['GET'])
112+
@login_required
66113
def edit_note_form(id):
67114
note = Note.query.get_or_404(id)
68115
return render_template('edit.html', note=note)
69116

70117
# Route to update a note
71118
@app.route('/notes/<int:id>', methods=['PUT'])
119+
@login_required
72120
def update_note(id):
73121
note = Note.query.get_or_404(id)
74122
data = request.json
@@ -79,6 +127,26 @@ def update_note(id):
79127
db.session.commit()
80128
return jsonify({'message': 'Note updated successfully'}), 200
81129

130+
# Route to register a new user
131+
@app.route('/register', methods=['GET', 'POST'])
132+
def register():
133+
if request.method == 'POST':
134+
username = request.form['username']
135+
password = request.form['password']
136+
137+
existing_user = User.query.filter_by(username=username).first()
138+
if existing_user:
139+
flash('Username already exists!')
140+
return redirect(url_for('register'))
141+
142+
new_user = User(username=username, password=password)
143+
db.session.add(new_user)
144+
db.session.commit()
145+
146+
flash('User registered successfully!')
147+
return redirect(url_for('login'))
148+
return render_template('register.html')
149+
82150
if __name__ == '__main__':
83151
app.run()
84-
152+

0 commit comments

Comments
 (0)