Spaces:
Runtime error
Runtime error
| # src/app.py (์ต์ข ํตํฉ ๋ฒ์ ) | |
| # --------------------------------- | |
| # 1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ชจ๋ ์ํฌํธ | |
| # --------------------------------- | |
| 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) ์ ์ | |
| # --------------------------------- | |
| # --- ์ฌ์ฉ์ ์ธ์ฆ ๊ด๋ จ ๋ผ์ฐํธ --- | |
| 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') | |
| 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') | |
| def logout(): | |
| session.pop('user_id', None) | |
| session.pop('username', None) | |
| return redirect(url_for('login')) | |
| # --- ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ผ์ฐํธ --- | |
| def home(): | |
| """๋ฉ์ธ ํ์ด์ง. ๋ก๊ทธ์ธํ์ง ์์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋.""" | |
| if 'user_id' not in session: | |
| return redirect(url_for('login')) | |
| # ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ด๋ฆ์ ํ ํ๋ฆฟ์ผ๋ก ์ ๋ฌ | |
| return render_template("emotion_homepage.html", username=session.get('username')) | |
| 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) | |
| 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"<b>[ ์ด ๊ฐ์ ์ ๋ ๊น์ด ๋๋ผ๊ณ ์ถ๋ค๋ฉด... (์์ฉ) ]</b><br>" | |
| f"โข {accept_choice}<br><br>" | |
| f"<b>[ ์ด ๊ฐ์ ์์ ๋ฒ์ด๋๊ณ ์ถ๋ค๋ฉด... (์ ํ) ]</b><br>" | |
| 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) |