Python Flask
https://flask.palletsprojects.com/en/2.3.x/installation/
Create an environment
C:\flask_dev>py -3 -m venv venv
Activate the environment
C:\flask_dev>venv\Scripts\activate
Install Flask
venv C:\flask_dev>pip install Flask
C:\flask_dev\flaskreact\app.py
Install requirements
Flask-SQLAlchemy
Flask-SQLAlchemy is an extension for Flask that adds support for SQLAlchemy to your application.
https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/
(venv) PS C:\flask_dev\flaskreact>pip install -U Flask-SQLAlchemy
Flask-Cors
A Flask extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible.
https://pypi.org/project/Flask-Cors/
(venv) PS C:\flask_dev\flaskreact>pip install -U flask-cors
C:\flask_dev\flaskreact\app.py
#C:\flask_dev\flaskreact\app.py
from flask import Flask, jsonify, request
from flask_marshmallow import Marshmallow #ModuleNotFoundError: No module named 'flask_marshmallow' = pip install flask-marshmallow https://pypi.org/project/flask-
from flask_cors import CORS, cross_origin #ModuleNotFoundError: No module named 'flask_cors' = pip install Flask-Cors
from models import db, Users
app = Flask(__name__)
app.config['SECRET_KEY'] = 'cairocoders-ednalan'
#app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///flaskdb.db'
# Databse configuration mysql Username:password@hostname/databasename
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:''@localhost/flaskreact'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
CORS(app, supports_credentials=True)
db.init_app(app)
with app.app_context():
db.create_all()
ma=Marshmallow(app)
class UserSchema(ma.Schema):
class Meta:
fields = ('id','name','email','password')
user_schema = UserSchema()
users_schema = UserSchema(many=True)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@app.route('/users', methods=['GET'])
def listusers():
all_users = Users.query.all()
results = users_schema.dump(all_users)
return jsonify(results)
@app.route('/userdetails/<id>',methods =['GET'])
def userdetails(id):
user = Users.query.get(id)
return user_schema.jsonify(user)
@app.route('/userupdate/<id>',methods = ['PUT'])
def userupdate(id):
user = Users.query.get(id)
name = request.json['name']
email = request.json['email']
user.name = name
user.email = email
db.session.commit()
return user_schema.jsonify(user)
@app.route('/userdelete/<id>',methods=['DELETE'])
def userdelete(id):
user = Users.query.get(id)
db.session.delete(user)
db.session.commit()
return user_schema.jsonify(user)
@app.route('/newuser',methods=['POST'])
def newuser():
name = request.json['name']
email = request.json['email']
password = request.json['password']
print(name)
print(email)
print(password)
users = Users(name=name, email=email, password=password)
db.session.add(users)
db.session.commit()
return user_schema.jsonify(users)
if __name__ == "__main__":
app.run(debug=True)
C:\flask_dev\flaskreact\models.py
#C:\flask_dev\flaskreact\models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Users(db.Model):
__tablename__ = "tblusers"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(150), index=True, unique=True)
email = db.Column(db.String(150), index=True, unique=True)
password = db.Column(db.String(255), index=True, unique=True)
run (venv) C:\flask_dev\flaskreact>flask run get all user
http://127.0.0.1:5000/users
get info
http://127.0.0.1:5000/userdetails/1
put update data
http://127.0.0.1:5000/userupdate/1
delete data
http://127.0.0.1:5000/userdelete/1
post add new
http://127.0.0.1:5000/newuser
json
{
"name":"cairocoders ednalan",
"email":"cairocoders@gmail.com",
"password":"123456"
}
React JS
https://create-react-app.dev/
Create Project
C:\react-js>npx create-react-app myreactdev
Run
C:\react-js\myreactdev> npm start
C:\react-js\myreactdev\src\App.js
//C:\react-js\myreactdev\src\App.js
import React, { } from "react";
import "./App.css";
import Home from "./components/Home";
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import View from "./components/View";
import Edit from "./components/Edit";
function App() {
return (
<div className="App">
<Router>
<Routes>
<Route exact path="/" element={<Home/>}/>
<Route exact path="/view/:id" element={<View/>}/>
<Route exact path="/edit/:id" element={<Edit/>}/>
</Routes>
</Router>
</div>
);
}
export default App;
https://github.com/axios/axios Installing the Axios Client
$ npm install axios
C:\reactdev\myreactdev>npm install axios
Install React Router Dom
https://www.npmjs.com/package/react-router-dom
C:\react-js\myreactdev>npm i react-router-dom --save
C:\react-js\myreactdev\src\components\Home.js
//C:\react-js\myreactdev\src\components\Home.js
import React, { useState } from 'react';
import List from './List';
import axios from 'axios';
const Home = () => {
const [userField, setUserField] = useState({
name: "",
email: "",
password: ""
});
const changeUserFieldHandler = (e) => {
setUserField({
...userField,
[e.target.name]: e.target.value
});
//console.log(userField);
}
const [loading,setLoading]=useState()
const onSubmitChange = async (e) => {
e.preventDefault();
try {
const responce= await axios.post("http://127.0.0.1:5000/newuser", userField);
console.log(responce)
setLoading(true);
} catch (err) {
console.log("Something Wrong");
}
}
if(loading){
return <Home/>
}
return (
<div className="container">
<h2 className='w-100 d-flex justify-content-center p-3'>React JS Laravel 10 REST API CRUD (Create, Read, Update and Delete) | Axios Mysql</h2>
<div className='row'>
<div className='col-md-4'>
<h3>Add Your Detail</h3>
<form>
<div className="mb-3 mt-3">
<label className="form-label"> Full Name:</label>
<input type="text" className="form-control" id="name" placeholder="Enter Your Full Name" name="name" onChange={e => changeUserFieldHandler(e)} />
</div>
<div className="mb-3 mt-3">
<label className="form-label">Email:</label>
<input type="email" className="form-control" id="email" placeholder="Enter email" name="email" onChange={e => changeUserFieldHandler(e)} required/>
</div>
<div className="mb-3 mt-3">
<label className="form-label">Password:</label>
<input type="text" className="form-control" id="password" placeholder="Enter password" name="password" onChange={e => changeUserFieldHandler(e)} required/>
</div>
<button type="submit" className="btn btn-primary" onClick={e => onSubmitChange(e)}>Add User</button>
</form>
</div>
<div className='col-md-8'>
<List />
</div>
</div>
</div>
)
};
export default Home;
C:\react-js\myreactdev\src\components\List.js
//C:\react-js\myreactdev\src\components\List.js
import React, { useState, useEffect } from 'react';
import { NavLink } from 'react-router-dom';
import axios from 'axios'
const List = () => {
const [userData, setUSerData] = useState([]);
useEffect(() => {
fetchData();
}, [])
const fetchData = async () => {
try {
const result = await axios("http://127.0.0.1:5000/users");
//console.log(result.data);
setUSerData(result.data)
} catch (err) {
console.log("somthing Wrong");
}
}
const handleDelete=async(id)=>{
console.log(id);
await axios.delete("http://127.0.0.1:5000/userdelete/"+id);
const newUserData=userData.filter((item)=>{
return(
item.id !==id
)
})
setUSerData(newUserData);
}
return(
<div className="container">
<h3>User Details</h3>
<table className="table table-bordered">
<thead>
<tr>
<th>S No.</th>
<th>Full Name</th>
<th>Email</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{
userData.map((user, i) => {
return (
<tr key={i}>
<td>{i + 1}</td>
<td>{user.name} </td>
<td>{user.email} </td>
<td>
<NavLink to={`/view/${user.id}`} className="btn btn-success mx-2">View</NavLink>
<NavLink to={`/edit/${user.id}`} className="btn btn-info mx-2">Edit</NavLink>
<button onClick={()=>handleDelete(user.id)} className="btn btn-danger">Delete</button>
</td>
</tr>
)
})
}
</tbody>
</table>
</div>
);
};
export default List;
C:\react-js\myreactdev\src\components\View.js
//C:\react-js\myreactdev\src\components\View.js
import axios from 'axios';
import React, { useState, useEffect } from 'react';
import { useParams,useNavigate } from 'react-router-dom';
const View = () => {
const {id}=useParams();
// console.log(id);
const[user,setUser]=useState([]);
const navigate = useNavigate();
useEffect(()=>{
fetchUser();
},[id]);
const fetchUser=async()=>{
try{
const result=await axios.get("http://127.0.0.1:5000/userdetails/"+id);
console.log(result.data);
setUser(result.data)
}catch(err){
console.log("Something Wrong");
}
}
const clickToBackHandler=()=>{
navigate('/');
}
return <div>
<div className="container">
<div className='row'>
<div className='col-md-12'>
<h1>User Details</h1>
<table className="table">
<thead>
<tr>
<th>S No.</th>
<th>Full Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr>
<td>{user.id}</td>
<td>{user.name}</td>
<td>{user.email}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div className='container d-flex justify-content-center'>
<div><button className='btn btn-primary' onClick={clickToBackHandler}>Back To Home</button></div>
</div>
</div>;
};
export default View;
C:\react-js\myreactdev\src\components\Edit.js
//C:\react-js\myreactdev\src\components\Edit.js
import React,{ useState, useEffect } from 'react';
import axios from 'axios';
import { useNavigate ,useParams } from 'react-router-dom';
const Edit = () => {
const {id}=useParams()
const navigate = useNavigate();
const clickToBackHandler=()=>{
navigate('/');
}
const [userField, setUserField] = useState({
name: "",
email: ""
});
useEffect(()=>{
fetchUser();
},[id])
const fetchUser=async()=>{
try{
const result=await axios.get("http://127.0.0.1:5000/userdetails/"+id);
// console.log(result.data);
setUserField(result.data)
}catch(err){
console.log("Something Wrong");
}
}
const changeUserFieldHandler = (e) => {
setUserField({
...userField,
[e.target.name]: e.target.value
});
console.log(userField);
}
const onSubmitChange = async (e) => {
e.preventDefault();
try {
await axios.put("http://127.0.0.1:5000/userupdate/"+id, userField);
navigate('/');
} catch (err) {
console.log("Something Wrong");
}
}
return(
<div className="container">
<h1>Edit Form</h1>
<form>
<div className="mb-3 mt-3">
<label className="form-label"> ID:</label>
<input type="text" className="form-control" id="id" name="id" value={id} disabled />
</div>
<div className="mb-3 mt-3">
<label className="form-label"> Full Name:</label>
<input type="text" className="form-control" placeholder="Enter Your Full Name" name="name" value={userField.name} onChange={e => changeUserFieldHandler(e)} />
</div>
<div className="mb-3 mt-3">
<label className="form-label">Email:</label>
<input type="email" className="form-control" id="email" placeholder="Enter email" name="email" value={userField.email} onChange={e => changeUserFieldHandler(e)}/>
</div>
<div className="mb-3 mt-3">
<label className="form-label">Password:</label>
<input type="text" className="form-control" id="password" placeholder="Enter password" name="password" onChange={e => changeUserFieldHandler(e)} required/>
</div>
<button type="submit" className="btn btn-primary" onClick={e=>onSubmitChange(e)}>Update</button>
</form>
<div className='container d-flex justify-content-center'>
<button className='btn btn-primary' onClick={ clickToBackHandler}>Back To Home</button>
</div>
</div>
);
};
export default Edit;
react-js\myreactdev\public\index.html
//react-js\myreactdev\public\index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>React App</title>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"/>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
Run C:\react-j\myreactdev>npm start http://localhost:3000/
