139 lines
4.9 KiB
Python
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)
|