├── .gitignore
├── instance
└── site.db
├── models.py
├── forms.py
├── templates
├── add.html
├── index.html
├── edit.html
├── delete.html
└── base.html
├── app.py
└── routes.py
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | *.pyc
3 | *.json
4 |
--------------------------------------------------------------------------------
/instance/site.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Subin-Vidhu/Create-Your-First-Web-App-with-Python-and-Flask/HEAD/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/templates/add.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block main %}
4 |
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 |
--------------------------------------------------------------------------------
/templates/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block main %}
4 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/templates/delete.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block main %}
4 |
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------