Add app folder .py , .txt and Dockerfile
This commit is contained in:
parent
74fafa1960
commit
cd72c29d2e
17
z1/app/Dockerfile
Normal file
17
z1/app/Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
FROM python:3.9-slim
|
||||
|
||||
# Set the working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy the requirements file and install Python dependencies
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy the application source code
|
||||
COPY app.py .
|
||||
|
||||
# Expose port 5000 for the Flask application
|
||||
EXPOSE 5000
|
||||
|
||||
# Start the Flask application
|
||||
CMD ["python", "app.py"]
|
149
z1/app/app.py
Normal file
149
z1/app/app.py
Normal file
@ -0,0 +1,149 @@
|
||||
from flask import Flask, request, render_template_string, redirect, url_for
|
||||
import os
|
||||
import psycopg2
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# Retrieve database connection settings
|
||||
db_host = os.environ.get("DB_HOST", "postgres_db")
|
||||
db_name = os.environ.get("POSTGRES_DB", "contacts_db")
|
||||
db_user = os.environ.get("POSTGRES_USER", "user")
|
||||
db_password = os.environ.get("POSTGRES_PASSWORD", "password")
|
||||
|
||||
# Function to make connection to database
|
||||
def get_db_connection():
|
||||
conn = psycopg2.connect(
|
||||
host=db_host,
|
||||
database=db_name,
|
||||
user=db_user,
|
||||
password=db_password
|
||||
)
|
||||
return conn
|
||||
|
||||
# Init database & create contacts table if doesn't exist
|
||||
def init_db():
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("""
|
||||
CREATE TABLE IF NOT EXISTS contacts (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
email VARCHAR(255) NOT NULL,
|
||||
phone VARCHAR(20) NOT NULL
|
||||
);
|
||||
""")
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
@app.route("/", methods=["GET", "POST"])
|
||||
def index():
|
||||
if request.method == "POST":
|
||||
name = request.form["name"]
|
||||
email = request.form["email"]
|
||||
phone = request.form["phone"]
|
||||
|
||||
# Add new contact at the database
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("INSERT INTO contacts (name, email, phone) VALUES (%s, %s, %s)",
|
||||
(name, email, phone))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
# Show all contacts
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("SELECT * FROM contacts")
|
||||
contacts = cur.fetchall()
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return render_template_string("""
|
||||
<html>
|
||||
<head><title>Contact Directory</title></head>
|
||||
<body>
|
||||
<h1>Contact Directory</h1>
|
||||
<form method="post">
|
||||
<input type="text" name="name" placeholder="Name" required>
|
||||
<input type="email" name="email" placeholder="Email" required>
|
||||
<input type="text" name="phone" placeholder="Phone">
|
||||
<button type="submit">Add Contact</button>
|
||||
</form>
|
||||
<h2>Contacts</h2>
|
||||
<ul>
|
||||
{% for contact in contacts %}
|
||||
<li>
|
||||
{{ contact[1] }} - {{ contact[2] }} - {{ contact[3] }}
|
||||
<a href="{{ url_for('remove_contact', contact_id=contact[0]) }}">Delete</a>
|
||||
<a href="{{ url_for('change_contact', contact_id=contact[0]) }}">Edit</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
""", contacts=contacts)
|
||||
|
||||
# How can you delete one contact ?
|
||||
@app.route("/remove/<int:contact_id>")
|
||||
def remove_contact(contact_id):
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("DELETE FROM contacts WHERE id = %s", (contact_id,))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
@app.route("/change/<int:contact_id>", methods=["GET", "POST"])
|
||||
def change_contact(contact_id):
|
||||
if request.method == "POST":
|
||||
name = request.form["name"]
|
||||
email = request.form["email"]
|
||||
phone = request.form["phone"]
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("UPDATE contacts SET name = %s, email = %s, phone = %s WHERE id = %s;", (name,email,phone, contact_id))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Show edit for contact
|
||||
conn = get_db_connection()
|
||||
cur = conn.cursor()
|
||||
cur.execute("SELECT * FROM contacts WHERE id = %s", (contact_id,))
|
||||
contact = cur.fetchone()
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return render_template_string("""
|
||||
<html>
|
||||
<head><title>Edit Contact</title></head>
|
||||
<body>
|
||||
<h1>Edit Contact</h1>
|
||||
<form method="POST">
|
||||
<ul>
|
||||
<li>
|
||||
<label for="name">New Name</label>
|
||||
<input type="name" name="name" value="{{ contact[1] }}" required></li>
|
||||
<li>
|
||||
<label for="email">New Email</label>
|
||||
<input type="email" name="email" value="{{ contact[2] }}" required></li>
|
||||
<li>
|
||||
<label for="phone">New Phone</label>
|
||||
<input type="phone" name="phone" value="{{ contact[3] }}" required></li>
|
||||
<button type="submit">Update Contact</button>
|
||||
|
||||
</form>
|
||||
<a href="{{ url_for('index') }}">Back to Contacts</a>
|
||||
</body>
|
||||
</html>
|
||||
""", contact=contact)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
init_db() # Initialiser la base de données et la table
|
||||
app.run(host='0.0.0.0', port=5000)
|
||||
|
3
z1/app/requirements.txt
Normal file
3
z1/app/requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
Flask
|
||||
psycopg2-binary
|
||||
|
Loading…
Reference in New Issue
Block a user