├── .gitignore ├── app.py ├── forms.py ├── instance └── site.db ├── models.py ├── routes.py └── templates ├── add.html ├── base.html ├── delete.html ├── edit.html └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.pyc 3 | *.json 4 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import inspect 2 | from flask import Flask 3 | from flask_sqlalchemy import SQLAlchemy 4 | 5 | app = Flask(__name__) 6 | app.config['SECRET_KEY'] = '8u3rouhfkjdsfiluh' 7 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' 8 | 9 | db = SQLAlchemy(app) 10 | def create_db(): 11 | with app.app_context(): 12 | if not inspect(db.engine).has_table('task'): 13 | db.create_all() 14 | print("Database created.") 15 | else: 16 | print("Database already exists.") 17 | 18 | from routes import * 19 | 20 | if __name__ == '__main__': 21 | create_db() 22 | app.run(debug=True) 23 | -------------------------------------------------------------------------------- /forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, SubmitField 3 | from wtforms.validators import DataRequired 4 | 5 | 6 | class AddTaskForm(FlaskForm): 7 | title = StringField('Title', validators=[DataRequired()]) 8 | submit = SubmitField('Submit') 9 | 10 | class DeleteTaskForm(FlaskForm): 11 | submit = SubmitField('Delete') 12 | -------------------------------------------------------------------------------- /instance/site.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Subin-Vidhu/Create-Your-First-Web-App-with-Python-and-Flask/26b7d0b01d75570ce16ab9f749df0dab6f60dff9/instance/site.db -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | 3 | class Task(db.Model): 4 | id = db.Column(db.Integer, primary_key=True) 5 | title = db.Column(db.String(255), nullable=False) 6 | date = db.Column(db.Date, nullable=False) 7 | 8 | def __repr__(self): 9 | return f'{self.title}' 10 | -------------------------------------------------------------------------------- /routes.py: -------------------------------------------------------------------------------- 1 | from app import app, db 2 | from flask import render_template, url_for, flash, get_flashed_messages, redirect, request 3 | from datetime import datetime 4 | 5 | import models 6 | import forms 7 | 8 | 9 | @app.route('/') 10 | @app.route('/index') 11 | def index(): 12 | tasks = models.Task.query.all() 13 | return render_template('index.html', tasks=tasks) 14 | 15 | 16 | @app.route('/add', methods=['GET', 'POST']) 17 | def add(): 18 | form = forms.AddTaskForm() 19 | if form.validate_on_submit(): 20 | task = models.Task(title=form.title.data, date=datetime.utcnow()) 21 | db.session.add(task) 22 | db.session.commit() 23 | flash('Task added') 24 | return redirect(url_for('index')) 25 | return render_template('add.html', form=form) 26 | 27 | 28 | @app.route('/edit/', methods=['GET', 'POST']) 29 | def edit(task_id): 30 | form = forms.AddTaskForm() 31 | task = models.Task.query.get(task_id) 32 | print(task) 33 | if task: 34 | if form.validate_on_submit(): 35 | task.title = form.title.data 36 | task.date = datetime.utcnow() 37 | db.session.commit() 38 | flash('Task updated') 39 | return redirect(url_for('index')) 40 | form.title.data = task.title 41 | return render_template('edit.html', form=form, task_id=task_id) 42 | flash(f'Task with id {task_id} does not exit') 43 | return redirect(url_for('index')) 44 | 45 | 46 | @app.route('/delete/', methods=['GET', 'POST']) 47 | def delete(task_id): 48 | form = forms.DeleteTaskForm() 49 | task = models.Task.query.get(task_id) 50 | if task: 51 | if form.validate_on_submit(): 52 | if form.submit.data: 53 | db.session.delete(task) 54 | db.session.commit() 55 | flash('Task deleted') 56 | return redirect(url_for('index')) 57 | return render_template('delete.html', form=form, task_id=task_id, title=task.title) 58 | flash(f'Task with id {task_id} does not exit') 59 | return redirect(url_for('index')) 60 | -------------------------------------------------------------------------------- /templates/add.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block main %} 4 |
5 |
6 | {{ form.csrf_token }} 7 |
8 |

Add Task

9 |
10 | {{ form.title(class="form-control") }} 11 |
12 |
13 | {{ form.submit(class="btn btn-primary") }} 14 |
15 |
16 |
17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Tasks 12 | 13 | 14 |
15 | 21 |
22 | {% with messages = get_flashed_messages() %} 23 | {% if messages %} 24 | {% for message in messages %} 25 |
26 | {{ message }} 27 |
28 | {% endfor %} 29 | {% endif %} 30 | {% endwith %} 31 |
32 | {% block main %}{% endblock %} 33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /templates/delete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block main %} 4 |
5 |
6 | {{ form.csrf_token }} 7 |

Are you sure you want to delete the following task?

8 |
9 |
10 |

{{ title }}

11 |
12 |
13 | {{ form.submit(class="btn btn-danger") }} 14 | Cancel 15 |
16 |
17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /templates/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block main %} 4 |
5 |
6 | {{ form.csrf_token }} 7 |
8 |

Edit Task

9 |
10 | {{ form.title(class="form-control") }} 11 |
12 |
13 | {{ form.submit(class="btn btn-primary") }} 14 |
15 |
16 |
17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block main %} 4 | {% for task in tasks %} 5 |
6 |
7 |

{{ task.title }}

8 |

Added on {{ task.date }}

9 | Edit 10 | Delete 11 |
12 |
13 | {% endfor %} 14 | {% endblock %} 15 | --------------------------------------------------------------------------------