Files
OspowWebsite/app.py
2026-03-16 16:11:19 +01:00

139 lines
4.9 KiB
Python

"""
Point d'entrée principal de l'application Ospow.
Chaque route = une page du site.
Pour ajouter une page : créer templates/ma_page.html et ajouter une route ici.
"""
from flask import Flask, render_template, request, flash, redirect, url_for, Response
from flask_mail import Mail, Message
from datetime import date
import os
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
app.secret_key = os.environ.get("SECRET_KEY", "changez-moi-en-production")
# --- Configuration de l'envoi d'emails ---
app.config["MAIL_SERVER"] = os.environ.get("MAIL_SERVER", "smtp.gmail.com")
app.config["MAIL_PORT"] = int(os.environ.get("MAIL_PORT", 587))
app.config["MAIL_USE_TLS"] = True
app.config["MAIL_USERNAME"] = os.environ.get("MAIL_USERNAME", "")
app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWORD", "")
app.config["MAIL_DEFAULT_SENDER"] = os.environ.get("MAIL_USERNAME", "")
mail = Mail(app)
CONTACT_EMAIL = os.environ.get("CONTACT_EMAIL", "contact@ospow.fr")
# ─── Context global (disponible dans tous les templates) ──────────────────────
@app.context_processor
def inject_globals():
return {"current_year": date.today().year}
# ─── Pages ────────────────────────────────────────────────────────────────────
@app.route("/")
def index():
return render_template("index.html")
@app.route("/surveillance")
def surveillance():
return render_template("surveillance.html")
@app.route("/cloud")
def cloud():
return render_template("cloud.html")
@app.route("/opensource")
def opensource():
return render_template("opensource.html")
@app.route("/equipe")
def equipe():
return render_template("equipe.html")
@app.route("/contact", methods=["GET", "POST"])
def contact():
if request.method == "POST":
nom = request.form.get("nom", "").strip()
email = request.form.get("email", "").strip()
sujet = request.form.get("sujet", "").strip()
message = request.form.get("message", "").strip()
# Validation basique
errors = []
if not nom:
errors.append("Le nom est obligatoire.")
if not email or "@" not in email:
errors.append("Adresse email invalide.")
if not message:
errors.append("Le message ne peut pas être vide.")
if errors:
for e in errors:
flash(e, "error")
return render_template("contact.html", form_data=request.form)
# Envoi de l'email
try:
msg = Message(
subject=f"[Ospow Contact] {sujet or 'Nouveau message'}",
recipients=[CONTACT_EMAIL],
body=f"De : {nom} <{email}>\n\n{message}",
reply_to=email,
)
mail.send(msg)
flash("Votre message a bien été envoyé. Nous vous répondrons rapidement !", "success")
return redirect(url_for("contact"))
except Exception as exc:
app.logger.error("Erreur envoi mail : %s", exc)
flash("Une erreur est survenue lors de l'envoi. Réessayez plus tard.", "error")
return render_template("contact.html", form_data={})
# ─── SEO : sitemap & robots ───────────────────────────────────────────────────
@app.route("/sitemap.xml")
def sitemap():
pages = [
(url_for("index", _external=True), "weekly", "1.0"),
(url_for("surveillance",_external=True), "monthly", "0.9"),
(url_for("cloud", _external=True), "monthly", "0.9"),
(url_for("opensource", _external=True), "monthly", "0.9"),
(url_for("equipe", _external=True), "monthly", "0.7"),
(url_for("contact", _external=True), "monthly", "0.6"),
]
today = date.today().isoformat()
lines = ['<?xml version="1.0" encoding="UTF-8"?>',
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">']
for loc, freq, priority in pages:
lines.append(
f" <url><loc>{loc}</loc>"
f"<lastmod>{today}</lastmod>"
f"<changefreq>{freq}</changefreq>"
f"<priority>{priority}</priority></url>"
)
lines.append("</urlset>")
return Response("\n".join(lines), mimetype="application/xml")
@app.route("/robots.txt")
def robots():
txt = (
"User-agent: *\n"
"Allow: /\n"
f"Sitemap: {url_for('sitemap', _external=True)}\n"
)
return Response(txt, mimetype="text/plain")
# ─── Lancement ────────────────────────────────────────────────────────────────
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)