Flask CRUD Application with MySQL
In this tutorial we will create a CRUD (Create, Read, Update and Delete) application in Flask with MySQL database
First, we have to install Flask package and MySQL
pip install flask
pip install flask_mysqldb
Creating the Database and Table
Execute the following SQL query to create a table named 'tbl_users' inside your MySQL database named 'db_flask'.
CREATE TABLE tbl_users ( uid int(11) NOT NULL AUTO_INCREMENT, name varchar(150) NOT NULL, email varchar(50) NOT NULL, age varchar(50) NOT NULL, contact varchar(50) NOT NULL, address varchar(150) NOT NULL, PRIMARY KEY (uid) );
File Structure:
Creating Project :
- Create a folder 'crudapp'.
- Create 'app.py' file inside of 'crudapp' folder.
- Create the 'templates' folder inside of 'crudapp' folder for creating HTML page.
- Create _layout.html, index.html, add_user.html and edit.html files inside of 'templates' folder.
app.py
from flask import Flask,render_template,request,flash,session,redirect from flask_mysqldb import MySQL app = Flask(__name__) app.config['MYSQL_HOST']='localhost' app.config['MYSQL_USER']='root' app.config['MYSQL_PASSWORD']='' app.config['MYSQL_DB']='db_flask' app.config['MYSQL_CURSORCLASS']='DictCursor' mysql=MySQL(app) @app.route('/') @app.route('/index',methods=['POST','GET']) def index(): cur = mysql.connection.cursor() cur.execute("select * from tbl_users") data = cur.fetchall() return render_template("index.html",datas = data) @app.route('/home',methods=['POST','GET']) def home(): return render_template("home.html") @app.route('/add_user',methods=['POST','GET']) def add_user(): if request.method=='POST': a=request.form["uname"] b=request.form["contact"] c=request.form["age"] d=request.form["email"] e=request.form["address"] cur = mysql.connection.cursor() cur.execute("INSERT INTO tbl_users( `name`, `email`, `age`, `contact`,`address`) values(%s,%s,%s,%s,%s)",(a,d,c,b,e)) mysql.connection.commit() cur.close() flash('User Added Successfully','success') return render_template('add_user.html') @app.route('/edit/<string:uid>',methods=['GET','POST']) def edit(uid): if request.method=='POST': a=request.form["uname"] b=request.form["contact"] c=request.form["age"] d=request.form["email"] e=request.form["address"] cur=mysql.connection.cursor() cur.execute("update `tbl_users` set `name`=%s, `email`=%s, `age`=%s, `contact`=%s, `address`=%s where uid=%s",(a,d,c,b,e,uid)) mysql.connection.commit() cur.close() cur=mysql.connection.cursor() cur.execute("select * from tbl_users where uid=%s",(uid,)) data=cur.fetchone() return render_template("edit.html",data=data) @app.route('/user_delete/<string:uid>',methods=['GET','POST']) def user_delete(uid): cur=mysql.connection.cursor() cur.execute("delete from tbl_users where uid=%s",(uid)) mysql.connection.commit() cur.close() return redirect(url_for("index")) if __name__ == ('__main__'): app.secret_key='secret123' app.run(debug=True)
_layout.html
<html> <head> <title>Index</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js" integrity="sha384-+sLIOodYLS7CIrQpBjl+C7nPvqq+FbNUBDunl/OZv93DB7Ln/533i8e/mZXLi/P+" crossorigin="anonymous"></script> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-danger"> <a class="navbar-brand" href="#">FLASK CRUD OPERATION WITH MySQL</a> <div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="navbar-nav ml-auto"> <a class="nav-link active" href="#">Home </a> </div> </div> </nav> <div class='container'> <div class='row mt-5'> <div class='col-md-8'> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category,message in messages %} <div class="alert alert-dismissible fade show alert-{{ category }}"" role="alert"> {{ message }} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> {% endfor %} {% endif %} {% endwith %} </div> </div> <div class='row'> {% block body %} {% endblock %} </div> </div> </body> </html>
index.html
{% extends '_layout.html' %} {% block body %} <p class='mx-auto '><h3 style='color:#6c757d;'>FLASK CRUD OPERATION WITH MySQL</h3></p> <p class='ml-auto mt-5'><a href='/add_user' class='btn btn-success'>+ Add User</a></p> <table class='table table-bordered table-striped'> <thead> <tr> <th>Sno</th> <th>Name</th> <th>Contact</th> <th>Age</th> <th>Email</th> <th>Address</th> <th>Edit</th> <th>Delete</th> </tr> </thead> <tbody> {% for row in datas %} <tr> <td>{{loop.index}}</td> <td>{{row.name}}</td> <td>{{row.contact}}</td> <td>{{row.age}}</td> <td>{{row.email}}</td> <td>{{row.address}}</td> <td><a href='{{url_for("edit",uid=row.uid)}}' class='btn btn-info'>Edit</a></td> <td><a href='{{url_for("user_delete",uid=row.uid)}}' class='btn btn-danger'>Delete</a></td> </tr> {% endfor %} </tbody> </table> {% endblock %}
add_user.html
{% extends '_layout.html' %} {% block body %} <div class='col-md-6 mx-auto'> <form method='post' autocomplete='off'> <div class='form-group'> <label>Name</label> <input type='text' class='form-control form-control-sm' name='uname'> </div> <div class='form-group'> <label>Contact</label> <input type='text' class='form-control form-control-sm' name='contact'> </div> <div class='form-group'> <label>Age</label> <input type='text' class='form-control form-control-sm' name='age'> </div> <div class='form-group'> <label>Email</label> <input type='text' class='form-control form-control-sm' name='email'> </div> <div class='form-group'> <label>Address</label> <input type='text' class='form-control form-control-sm' name='address'> </div> <input type='submit' name='submit' value='submit' class='btn btn-sm btn-success'> </form> </div> {% endblock %}
edit.html
{% extends '_layout.html' %} {% block body %} <div class='col-md-6 mx-auto'> <form method='post' autocomplete='off'> <div class='form-group'> <label>Name</label> <input type='text' class='form-control form-control-sm' name='uname' value='{{data.name}}'> </div> <div class='form-group'> <label>Contact</label> <input type='text' class='form-control form-control-sm' name='contact' value='{{data.contact}}'> </div> <div class='form-group'> <label>Age</label> <input type='text' class='form-control form-control-sm' name='age' value='{{data.age}}'> </div> <div class='form-group'> <label>Email</label> <input type='text' class='form-control form-control-sm' name='email' value='{{data.email}}'> </div> <div class='form-group'> <label>Address</label> <input type='text' class='form-control form-control-sm' name='address' value='{{data.address}}'> </div> <input type='submit' name='submit' value='submit' class='btn btn-sm btn-success'> </form> </div> {% endblock %}
Run the Project:
- Run 'app.py' file.
- Browse the URL 'localhost:5000'.