new
This commit is contained in:
commit
14402085f5
20
z1/Dockerfile
Normal file
20
z1/Dockerfile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
FROM python:3.8
|
||||||
|
|
||||||
|
COPY requirements.txt /
|
||||||
|
|
||||||
|
WORKDIR /
|
||||||
|
|
||||||
|
RUN pip3 install -r ./requirements.txt --no-cache-dir
|
||||||
|
|
||||||
|
COPY . /app/
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
|
||||||
|
ENV FLASK_APP=app.py
|
||||||
|
|
||||||
|
|
||||||
|
# RUN python manage.py create_db
|
||||||
|
|
||||||
|
|
||||||
|
CMD flask run -h 0.0.0.0 -p 1602
|
21
z1/LICENSE
Normal file
21
z1/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 NOMANSAEEDSOOMRO
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
1
z1/Procfile
Normal file
1
z1/Procfile
Normal file
@ -0,0 +1 @@
|
|||||||
|
web: gunicorn app:app
|
62
z1/README.md
Normal file
62
z1/README.md
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# Flask-App-with-PostgreSQL-DB
|
||||||
|
|
||||||
|
This Website is build on the Python Flask with PostgreSQL Database. Data Insertion and Fetching.
|
||||||
|
|
||||||
|
**For Running on Local System Follow the below insturction**
|
||||||
|
|
||||||
|
Comment the below Code in the app.py File
|
||||||
|
|
||||||
|
'uri = os.getenv("DATABASE_URL") # or other relevant config var
|
||||||
|
if uri.startswith("postgres://"):
|
||||||
|
uri = uri.replace("postgres://", "postgresql://", 1)'
|
||||||
|
|
||||||
|
UnComment the Below code in the app.py file
|
||||||
|
|
||||||
|
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///User.sqlite3"
|
||||||
|
|
||||||
|
Run the app.py file and in the Terminal run the below commands
|
||||||
|
|
||||||
|
pyhton
|
||||||
|
|
||||||
|
from app import db
|
||||||
|
|
||||||
|
db.create_all()
|
||||||
|
|
||||||
|
|
||||||
|
**If you are Using libraries then run the pip freeze command and for the deployment on heroku follow the below commands**
|
||||||
|
|
||||||
|
UnComment the below Code in the app.py File
|
||||||
|
|
||||||
|
'uri = os.getenv("DATABASE_URL") # or other relevant config var
|
||||||
|
if uri.startswith("postgres://"):
|
||||||
|
uri = uri.replace("postgres://", "postgresql://", 1)'
|
||||||
|
|
||||||
|
Comment the Below code in the app.py file
|
||||||
|
|
||||||
|
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///User.sqlite3"
|
||||||
|
|
||||||
|
|
||||||
|
pip install gunicorn
|
||||||
|
|
||||||
|
pip install psycopg2
|
||||||
|
|
||||||
|
pip freeze > requirements.txt
|
||||||
|
|
||||||
|
Create runtime.txt and write your python version i.e python-3.7.10
|
||||||
|
|
||||||
|
echo web: gunicorn app:app > Procfile #creating procfile
|
||||||
|
|
||||||
|
Create an account on heroku and also download the heroku cli
|
||||||
|
|
||||||
|
##Write Following commands in pycharm/vscode
|
||||||
|
1. heroku login
|
||||||
|
2. heroku create "project name"
|
||||||
|
3. heroku addons:create heroku-postgresql:hobby-dev --app "project name"
|
||||||
|
4. git init
|
||||||
|
5. git add .
|
||||||
|
6. git commit -m "first commit"
|
||||||
|
7. heroku git:remote -a "project name"
|
||||||
|
8. git push heroku master
|
||||||
|
9. heroku run python
|
||||||
|
10. from app import db
|
||||||
|
11. db.create_all()
|
BIN
z1/__pycache__/app.cpython-38.pyc
Normal file
BIN
z1/__pycache__/app.cpython-38.pyc
Normal file
Binary file not shown.
73
z1/app.py
Normal file
73
z1/app.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
from flask import Flask, render_template, request, redirect, url_for
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
uri = os.getenv("DATABASE_URL") # or other relevant config var
|
||||||
|
uri ="postgresql://postgres:postgres@db_postgres:5432/postgres"
|
||||||
|
if uri.startswith("postgres://"):
|
||||||
|
uri = uri.replace("postgres://", "postgresql://", 1)
|
||||||
|
# rest of connection code using the connection string `uri`
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||||
|
|
||||||
|
app.config["SQLALCHEMY_DATABASE_URI"] = uri
|
||||||
|
#app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///User.sqlite3"
|
||||||
|
|
||||||
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class User(db.Model):
|
||||||
|
__tablename__ = "user"
|
||||||
|
|
||||||
|
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||||
|
name = db.Column(db.String(100), nullable=False)
|
||||||
|
email = db.Column(db.String(100), nullable=False)
|
||||||
|
gender = db.Column(db.String(100), nullable=False)
|
||||||
|
password = db.Column(db.String(100), nullable=False)
|
||||||
|
|
||||||
|
def __init__(self, name, email, gender, password):
|
||||||
|
self.name = name
|
||||||
|
self.email = email
|
||||||
|
self.gender = gender
|
||||||
|
self.password = password
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
db.create_all()
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def home():
|
||||||
|
db.create_all()
|
||||||
|
return redirect(url_for('index'))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/index", methods=["GET", "POST"])
|
||||||
|
def index():
|
||||||
|
if request.method == 'POST': # When a user clicks submit button it will come here.
|
||||||
|
data = request.form # request the data from the form in index.html file
|
||||||
|
name = data["name"]
|
||||||
|
email = data["email"]
|
||||||
|
gender = data["Gender"]
|
||||||
|
password = data["password"]
|
||||||
|
|
||||||
|
new_data = User(name, email, gender, password)
|
||||||
|
db.session.add(new_data)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
user_data = User.query.all()
|
||||||
|
#print(user_data)
|
||||||
|
|
||||||
|
#return render_template("index.html" , user_data=user_data) # passes user_data variable into the index.html file.
|
||||||
|
return render_template("usersdata.html")
|
||||||
|
|
||||||
|
@app.route("/usersdata")
|
||||||
|
def usersdata():
|
||||||
|
return render_template("usersdata.html" , user_data = User.query.all())
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True, port=1602)
|
25
z1/docker-compose.postgres.yml
Normal file
25
z1/docker-compose.postgres.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
version: '3.9'
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
container_name: db_postgres
|
||||||
|
image: postgres
|
||||||
|
hostname: postgres
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
volumes:
|
||||||
|
- postgres-volume:/var/lib/postgresql/data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- test-net
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres-volume:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
test-net:
|
||||||
|
external: true
|
25
z1/docker-compose.yml
Normal file
25
z1/docker-compose.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
version: '3.9'
|
||||||
|
services:
|
||||||
|
flask:
|
||||||
|
build:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
context: .
|
||||||
|
environment:
|
||||||
|
# DATABASE DETAILS
|
||||||
|
- DBNAME=test_db
|
||||||
|
- DBUSER=postgres
|
||||||
|
- DBPASS=postgres
|
||||||
|
- DBPORT=5450
|
||||||
|
- DBHOST=0.0.0.0
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "8050:1602"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- test-net
|
||||||
|
|
||||||
|
|
||||||
|
networks:
|
||||||
|
test-net:
|
||||||
|
external: true
|
||||||
|
|
16
z1/manage.py
Normal file
16
z1/manage.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from flask.cli import FlaskGroup
|
||||||
|
from app import db
|
||||||
|
import app
|
||||||
|
cli = FlaskGroup(app)
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command("create_db")
|
||||||
|
def create_db():
|
||||||
|
db.drop_all()
|
||||||
|
db.create_all()
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
from exc
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
|
if __name__ == "__main__":
|
||||||
|
cli()
|
1
z1/remove app.sh
Normal file
1
z1/remove app.sh
Normal file
@ -0,0 +1 @@
|
|||||||
|
echo "Docker Container, Network, Volume removed "
|
15
z1/requirements.txt
Normal file
15
z1/requirements.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
click==8.0.1
|
||||||
|
colorama==0.4.4
|
||||||
|
Flask==2.0.1
|
||||||
|
Flask-SQLAlchemy==2.5.1
|
||||||
|
greenlet==1.1.0
|
||||||
|
gunicorn==20.1.0
|
||||||
|
importlib-metadata==4.0.1
|
||||||
|
itsdangerous==2.0.1
|
||||||
|
Jinja2==3.0.1
|
||||||
|
MarkupSafe==2.0.1
|
||||||
|
psycopg2-binary==2.9.1
|
||||||
|
SQLAlchemy==1.4.15
|
||||||
|
typing-extensions==3.10.0.0
|
||||||
|
Werkzeug==2.0.1
|
||||||
|
zipp==3.4.1
|
1
z1/runtime.txt
Normal file
1
z1/runtime.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
python-3.7.10
|
2
z1/start.app.sh
Normal file
2
z1/start.app.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
docker compose stop
|
||||||
|
echo "Docker containers start "
|
2
z1/stop.app.sh
Normal file
2
z1/stop.app.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
docker compose stop
|
||||||
|
echo "Docker containers stopped SSS"
|
103
z1/templates/index.html
Normal file
103
z1/templates/index.html
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Register Page</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
|
||||||
|
<style >
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
background-image: linear-gradient(to right , #37B9E9 , #63C4C9 ,#E3F2FD );
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="container-fluid mt-2 ">
|
||||||
|
|
||||||
|
<marquee> <p class="text-capitalize text-white mx-3 mt-3" style="font-size: 25px">Flask App with DataBase</p> </marquee>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container text-capitalize">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h1 class="text-center mt-4 text-white">Create Account </h1>
|
||||||
|
<hr class="w-25 mx-auto mt-auto" style="border: 04px solid #003D51; border-radius: 5px">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<div class="card border-secondary">
|
||||||
|
<div class="card-header" style="background-color: #557D8B">
|
||||||
|
<h3 class="mb-0 my-2 text-white" >User Data Form</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body" style="background-color: #e3f2fd">
|
||||||
|
<form class="form text-capitalize" role="form" autocomplete="off"
|
||||||
|
action="" method="POST">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="inputName" >Full Name</label>
|
||||||
|
<input type="text" class="form-control" placeholder="Enter your Full Name"required="" name="name">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="inputEmail3" >Email</label>
|
||||||
|
<input type="email" class="form-control" placeholder="Email@gmail.com" required="" name="email">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="gender" >Gender</label>
|
||||||
|
<select class="custom-select form-inline" name="Gender">
|
||||||
|
<option selected>Choose...</option>
|
||||||
|
<option value="male" name="Gender" >Male</option>
|
||||||
|
<option value="female" name="Gender"> Female</option>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="inputPassword3" >Password</label>
|
||||||
|
<input type="password" class="form-control" placeholder="Enter your Password" title="At least 6 characters with letters and numbers" required="" name="password">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="submit" class="btn btn-lg float-right text-white" style="background-color: #003D51" name="Reg">Register</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="invalidCheck2" required>
|
||||||
|
<label class="form-check-label" for="invalidCheck2">
|
||||||
|
I Agree to the terms and conditions.
|
||||||
|
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--/row-->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!--/col-->
|
||||||
|
</div>
|
||||||
|
<!--/row-->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<footer id="sticky-footer" class="py-3 text-dark-90 mt-5" style="background-color: #E3F2FD" >
|
||||||
|
<div class="container text-center">
|
||||||
|
<small>Copyright © NSA Website</small>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
42
z1/templates/usersdata.html
Normal file
42
z1/templates/usersdata.html
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Bootstrap Example</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container mt-5" >
|
||||||
|
<h2>User's Data</h2>
|
||||||
|
<p>Fetching data from database </p>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Id</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>Gender</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<!-- The user_data is a variable containing all the user data from the DB. -->
|
||||||
|
|
||||||
|
{% for user in user_data %}
|
||||||
|
<tr>
|
||||||
|
<td>{{user.id}}</td>
|
||||||
|
<td>{{user.name}}</td>
|
||||||
|
<td>{{user.email}}</td>
|
||||||
|
<td>{{user.gender}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user