# src/app.py 백업용
# ---------------------------------
# 1. 라이브러리 및 모듈 임포트
# ---------------------------------
from .models import User,Diary # db관련 모델
import os
import random
from flask import Flask, render_template, request, jsonify, session, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
# '현재 폴더에 있는' 모듈들을 상대 경로로 임포트
from .emotion_engine import load_emotion_classifier, predict_emotion
from .recommender import Recommender
# ---------------------------------
# 2. Flask 앱 초기화 및 기본 설정
# ---------------------------------
app = Flask(__name__)
# 데이터베이스 파일 경로 설정
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'database.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 세션 데이터를 암호화하기 위한 시크릿 키 (⚠️ 실제 배포 시에는 더 복잡한 값으로 변경하세요!)
app.config['SECRET_KEY'] = 'dev-secret-key-for-flask-session'
# 데이터베이스 객체 생성
db = SQLAlchemy(app)
# ---------------------------------
# 3. 데이터베이스 모델 정의
# ---------------------------------
class User(db.Model):
"""사용자 정보 저장을 위한 모델"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
def set_password(self, password):
"""비밀번호를 해싱하여 저장"""
self.password_hash = generate_password_hash(password)
def check_password(self, password):
"""해시된 비밀번호와 입력된 비밀번호를 비교"""
return check_password_hash(self.password_hash, password)
# ---------------------------------
# 4. AI 엔진 및 추천기 초기 로딩
# ---------------------------------
print("AI 챗봇 서버를 준비 중입니다...")
emotion_classifier = load_emotion_classifier()
recommender = Recommender()
emotion_emoji_map = {
'기쁨': '😄', '행복': '😊', '사랑': '❤️',
'불안': '😟', '슬픔': '😢', '상처': '💔',
'분노': '😠', '혐오': '🤢', '짜증': '😤',
'놀람': '😮',
'중립': '😐',
}
print("✅ AI 챗봇 서버가 성공적으로 준비되었습니다.")
# ---------------------------------
# 5. 라우트(Routes) 정의
# ---------------------------------
# --- 사용자 인증 관련 라우트 ---
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if User.query.filter_by(username=username).first():
return "이미 존재하는 사용자 이름입니다."
new_user = User(username=username)
new_user.set_password(password)
db.session.add(new_user)
db.session.commit()
return redirect(url_for('login'))
return render_template('signup.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
session['user_id'] = user.id
session['username'] = user.username
return redirect(url_for('home'))
else:
return "로그인 정보가 올바르지 않습니다."
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('user_id', None)
session.pop('username', None)
return redirect(url_for('login'))
# --- 메인 애플리케이션 라우트 ---
@app.route("/")
def home():
"""메인 페이지. 로그인하지 않은 경우 로그인 페이지로 이동."""
if 'user_id' not in session:
return redirect(url_for('login'))
# 로그인한 사용자의 이름을 템플릿으로 전달
return render_template("emotion_homepage.html", username=session.get('username'))
@app.route("/api/recommend", methods=["POST"])
def api_recommend():
"""일기 분석 및 콘텐츠 추천 API."""
# API 요청도 로그인된 사용자만 가능하도록 체크
if 'user_id' not in session:
return jsonify({"error": "로그인이 필요합니다."}), 401
user_diary = request.json.get("diary")
if not user_diary:
return jsonify({"error": "일기 내용이 없습니다."}), 400
predicted_emotion = predict_emotion(emotion_classifier, user_diary)
# --- 여기에 DB 저장 로직 추가 ---
try:
user_id = session['user_id']
# 새로운 Diary 객체를 만들어 DB에 저장합니다.
new_diary_entry = Diary(content=user_diary, emotion=predicted_emotion, user_id=user_id)
db.session.add(new_diary_entry)
db.session.commit()
except Exception as e:
# DB 저장 중 오류가 발생하면 서버 로그에 기록합니다.
print(f"DB 저장 오류: {e}")
db.session.rollback() # 오류 발생 시 작업을 되돌립니다.
accept_recs = recommender.recommend(predicted_emotion, "수용")
return jsonify(response_data)
accept_recs = recommender.recommend(predicted_emotion, "수용")
change_recs = recommender.recommend(predicted_emotion, "전환")
accept_choice = random.choice(accept_recs) if accept_recs else "추천 없음"
change_choice = random.choice(change_recs) if change_recs else "추천 없음"
recommendation_text = (
f"[ 이 감정을 더 깊이 느끼고 싶다면... (수용) ]
"
f"• {accept_choice}
"
f"[ 이 감정에서 벗어나고 싶다면... (전환) ]
"
f"• {change_choice}"
)
response_data = {
"emotion": predicted_emotion,
"emoji": emotion_emoji_map.get(predicted_emotion, '🤔'),
"recommendation": recommendation_text
}
return jsonify(response_data)
# ---------------------------------
# 6. 애플리케이션 실행
# ---------------------------------
if __name__ == "__main__":
with app.app_context():
db.create_all() # (선택사항) 앱 실행 시 DB가 없으면 자동으로 생성.
app.run(debug=True)