Add app folder .py , .txt and Dockerfile

This commit is contained in:
Charlyne Wargnier-Potier 2025-03-19 06:34:47 +00:00
parent 74fafa1960
commit cd72c29d2e
3 changed files with 169 additions and 0 deletions

17
z1/app/Dockerfile Normal file
View 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
View 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
View File

@ -0,0 +1,3 @@
Flask
psycopg2-binary