Flasksite / app.py
Docfile's picture
Create app.py
95a83ad verified
raw
history blame
10.5 kB
from flask import Flask,make_response,render_template, request, redirect, url_for, session, jsonify, flash
from datetime import datetime, timedelta
import sqlite3
from urllib.parse import urlparse
import requests
import yt_dlp
import functools
import time
import tempfile
import re
import psycopg2
from markupsafe import Markup
from gradio_client import Client,handle_file
from functools import wraps
import os
import google.generativeai as genai
import textwrap
import PIL.Image
from werkzeug.utils import secure_filename
from pytube import YouTube
from psycopg2.extras import RealDictCursor
import redis
DATABASE_URL='postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require'
GOOGLE_API_KEY = ''
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
}
safety_settings = [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_NONE"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_NONE"
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_NONE"
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_NONE"
},
]
genai.configure(api_key=GOOGLE_API_KEY)
MAX_CONTENT_LENGTH = 760 * 1024 * 1024 # 16MB max file size
def create_connection():
#le première c'est pour boma langue
#conn = psycopg2.connect("postgres://default:9fmSeFktMRV4@ep-cold-butterfly-a4hwib6l.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require")
conn = psycopg2.connect("postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require")
return conn
app = Flask(__name__)
app.secret_key = "uyyhhy77uu"
app.permanent_session_lifetime = timedelta(days=200)
@app.route('/')
def philosophie():
return render_template("philosophie.html")
# Route pour récupérer la liste des cours
@app.route('/api/philosophy/courses', methods=['GET'])
def get_philosophy_courses():
try:
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor(cursor_factory=RealDictCursor)
cur.execute("""
SELECT id, title, author, updated_at
FROM cours_philosophie
ORDER BY title
""")
courses = cur.fetchall()
cur.close()
conn.close()
return jsonify(courses)
except Exception as e:
print(f"Erreur lors de la récupération des cours : {e}")
return jsonify({"error": str(e)}), 500
# Route pour récupérer les détails d'un cours spécifique
@app.route('/api/philosophy/courses/<int:course_id>', methods=['GET'])
def get_philosophy_course(course_id):
try:
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor(cursor_factory=RealDictCursor)
cur.execute("""
SELECT id, title, content, author, created_at, updated_at
FROM cours_philosophie
WHERE id = %s
""", (course_id,))
course = cur.fetchone()
cur.close()
conn.close()
if course:
return jsonify(course)
return jsonify({"error": "Cours non trouvé"}), 404
except Exception as e:
print(f"Erreur lors de la récupération du cours : {e}")
return jsonify({"error": str(e)}), 500
# Route Flask mise à jour
@app.route('/submit_philo', methods=['POST'])
def submit_philo():
data = request.json
phi_prompt = data.get('question', '').strip()
phi_type = data.get('type', '1') # Type 1 par défaut
course_id = data.get('courseId')
if not phi_prompt:
return jsonify({"error": "Veuillez saisir un sujet."}), 400
try:
# Récupération du contenu du cours si un cours est sélectionné
course_content = ""
course_info = ""
if course_id:
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor(cursor_factory=RealDictCursor)
cur.execute("""
SELECT content, author, title
FROM cours_philosophie
WHERE id = %s
""", (course_id,))
result = cur.fetchone()
if result:
course_content = result['content']
course_info = f"\nBasé sur le cours '{result['title']}' de {result['author']}"
cur.close()
conn.close()
# Sélection de la méthodologie selon le type
if phi_type == '1':
methodologie = f"""
Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant:
# INTRODUCTION:
- Amorcer le sujet avec moins de deux phrases
- Poser le problème
- Formuler la problématique autour de deux questions essentielles:
- Question-thèse
- Question-antithèse
# DEVELOPPEMENT
## Première Partie: Formuler la thèse initiale
Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte.
## Deuxième Partie: Formuler l'antithèse
Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte.
# CONCLUSION
1. Bilan de la réflexion:
- Résumer les grandes parties de la réflexion
2. Prise de position
Je veux un travail bien détaillé et complet avec un français raffiné et soutenu.
"""
else: # Type 2
methodologie = f"""
Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant:
# INTRODUCTION:
- Approche par constat
- Posez la citation
- Reformulation de la citation
- Nuancez la thèse (antithèse)
- De cette opposition naît le problème
- En quoi
- Idée de la citation
# DÉVELOPPEMENT:
## Première partie (Thèse)
- Introduction partielle (thèse + arguments1 + arguments2)
- Argument 1:
* Explications
* Illustration (citation + reformulation)
- Argument 2:
* Explications
* Illustration (exemple + explication)
- Transition:
* Bilan (thèse + arguments1 + arguments2)
* Annonce de l'idée critique
## Deuxième partie (Antithèse)
- Introduction partielle (antithèse + arguments3 + arguments4)
- Argument 3:
* Explications
* Illustration (citation + reformulation)
- Argument 4:
* Explications
* Illustration (exemple + reformulation)
# CONCLUSION:
- Bilan global de l'analyse (rappel du problème + thèse + antithèse)
- Prise de position (réponse à la question critique de l'introduction)
Je veux un travail bien détaillé et complet avec un français raffiné et soutenu.
"""
# Ajout du contenu du cours à la prompt si disponible
if course_content:
methodologie += f"\nEn te basant sur le cours suivant:\n{course_content}"
prompt = methodologie
try:
model = genai.GenerativeModel(model_name="models/gemini-1.5-flash", safety_settings=safety_settings)
response = model.generate_content(prompt, request_options={"timeout": 900})
dissertation = response.text
return jsonify({"response": dissertation}), 200
except Exception as e:
print(f"Erreur dans la génération de contenu : {e}")
return jsonify({"error": str(e)}), 500
except Exception as e:
print(f"Erreur dans submit_philo : {e}")
return jsonify({"error": str(e)}), 500
@app.route('/admin/philosophy/courses', methods=['GET', 'POST', 'DELETE'])
def manage_philosophy_courses():
if request.method == 'GET':
try:
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor(cursor_factory=RealDictCursor)
cur.execute("SELECT * FROM cours_philosophie")
courses = cur.fetchall()
cur.close()
conn.close()
return render_template('philosophy_courses.html', courses=courses)
except Exception as e:
flash(f'Erreur lors de la récupération des cours : {e}', 'danger')
return redirect(url_for('manage_philosophy_courses'))
elif request.method == 'POST':
if 'title' in request.form: # Vérification pour savoir si le formulaire soumis est celui d'ajout
try:
title = request.form.get('title')
content = request.form.get('content')
author = request.form.get('author')
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor()
cur.execute("""
INSERT INTO cours_philosophie (title, content, author)
VALUES (%s, %s, %s)
""", (title, content, author))
conn.commit()
cur.close()
conn.close()
flash('Cours ajouté avec succès !', 'success')
return redirect(url_for('manage_philosophy_courses'))
except Exception as e:
flash(f'Erreur lors de l\'ajout du cours : {e}', 'danger')
return redirect(url_for('manage_philosophy_courses'))
else:
try:
course_id = request.form.get('id')
conn = psycopg2.connect(DATABASE_URL)
cur = conn.cursor()
cur.execute("DELETE FROM cours_philosophie WHERE id = %s", (course_id,))
conn.commit()
cur.close()
conn.close()
flash('Cours supprimé avec succès !', 'success')
return redirect(url_for('manage_philosophy_courses'))
except Exception as e:
flash(f'Erreur lors de la suppression du cours : {e}', 'danger')
return redirect(url_for('manage_philosophy_courses'))