kootaeng2 commited on
Commit
5883a42
ยท
1 Parent(s): c1b9543

Refactor:Loadmodel from Hugging Face Hub and remove local modelfiles

Browse files
Files changed (6) hide show
  1. run.py +11 -0
  2. src/{app.py โ†’ __app__backup.py} +18 -1
  3. src/__init__.py +23 -0
  4. src/auth.py +72 -0
  5. src/main.py +28 -0
  6. src/models.py +38 -0
run.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # src/run.py
2
+ # run.py - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํŒŒ์ผ
3
+
4
+ from src import create_app
5
+
6
+ app = create_app()
7
+
8
+ if __name__ == '__main__':
9
+ app.run(debug=True)
10
+
11
+
src/{app.py โ†’ __app__backup.py} RENAMED
@@ -1,8 +1,9 @@
1
- # src/app.py (์ตœ์ข… ํ†ตํ•ฉ ๋ฒ„์ „)
2
 
3
  # ---------------------------------
4
  # 1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ชจ๋“ˆ ์ž„ํฌํŠธ
5
  # ---------------------------------
 
6
  import os
7
  import random
8
  from flask import Flask, render_template, request, jsonify, session, redirect, url_for
@@ -127,6 +128,22 @@ def api_recommend():
127
  return jsonify({"error": "์ผ๊ธฐ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค."}), 400
128
 
129
  predicted_emotion = predict_emotion(emotion_classifier, user_diary)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
  accept_recs = recommender.recommend(predicted_emotion, "์ˆ˜์šฉ")
132
  change_recs = recommender.recommend(predicted_emotion, "์ „ํ™˜")
 
1
+ # src/app.py ๋ฐฑ์—…์šฉ
2
 
3
  # ---------------------------------
4
  # 1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ชจ๋“ˆ ์ž„ํฌํŠธ
5
  # ---------------------------------
6
+ from .models import User,Diary # db๊ด€๋ จ ๋ชจ๋ธ
7
  import os
8
  import random
9
  from flask import Flask, render_template, request, jsonify, session, redirect, url_for
 
128
  return jsonify({"error": "์ผ๊ธฐ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค."}), 400
129
 
130
  predicted_emotion = predict_emotion(emotion_classifier, user_diary)
131
+
132
+ # --- ์—ฌ๊ธฐ์— DB ์ €์žฅ ๋กœ์ง ์ถ”๊ฐ€ ---
133
+ try:
134
+ user_id = session['user_id']
135
+ # ์ƒˆ๋กœ์šด Diary ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด DB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
136
+ new_diary_entry = Diary(content=user_diary, emotion=predicted_emotion, user_id=user_id)
137
+ db.session.add(new_diary_entry)
138
+ db.session.commit()
139
+ except Exception as e:
140
+ # DB ์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์„œ๋ฒ„ ๋กœ๊ทธ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
141
+ print(f"DB ์ €์žฅ ์˜ค๋ฅ˜: {e}")
142
+ db.session.rollback() # ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ž‘์—…์„ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
143
+
144
+ accept_recs = recommender.recommend(predicted_emotion, "์ˆ˜์šฉ")
145
+
146
+ return jsonify(response_data)
147
 
148
  accept_recs = recommender.recommend(predicted_emotion, "์ˆ˜์šฉ")
149
  change_recs = recommender.recommend(predicted_emotion, "์ „ํ™˜")
src/__init__.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # src/__init__.py
2
+ # db ์ดˆ๊ธฐํ™”, ๋ธ”๋ฃจํ”„๋ฆฐํŠธ(์•ฑ ๋ถ„๋ฆฌ ํ˜„์žฌ๋Š” main, auth๋ถ„๋ฆฌ) ๋“ฑ๋ก
3
+
4
+ from flask import Flask
5
+ from flask_sqlalchemy import SQLAlchemy
6
+ import os
7
+
8
+ # db ์ƒ์„ฑ
9
+ db=SQLAlchemy()
10
+ def create_app():
11
+ app=Flask(__name__)
12
+ basedir = os.path.abspath(os.path.dirname(__file__))
13
+ app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'database.db')
14
+ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
15
+ app.config['SECRET_KEY'] = 'dev-secret-key-for-flask-session'
16
+ db.init_app(app)
17
+
18
+ from . import main, auth
19
+ app. register_blueprint(main.bp)
20
+ app.register_blueprint(auth.bp)
21
+
22
+
23
+ return app
src/auth.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # src/ auth.py
2
+ # ๊ธฐ์กด app.py์—์„œ auth์™€ ๊ด€๋ จํ•ด์„œ ๋ถ„๋ฆฌ
3
+ # ๋กœ๊ทธ์ธ์ด๋‚˜ ํšŒ์›๊ฐ€์ž… ์ธ์ฆ ๊ด€๋ จํ•œ ์Šคํฌ๋ฆฝํŠธ
4
+
5
+ from flask import Blueprint, render_template, request, redirect, url_for, session
6
+ from werkzeug.security import generate_password_hash, check_password_hash
7
+ from . import db
8
+ from .models import User
9
+
10
+ bp = Blueprint('auth', __name__, url_prefix='/auth')
11
+
12
+ # ํšŒ์›๊ฐ€์ž… ํŒŒํŠธ
13
+ @bp.route('/signup', methods=['GET', 'POST'])
14
+ def signup():
15
+ if request.method == 'POST':
16
+ username = request.form['username']
17
+ password = request.form['password']
18
+
19
+ # ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์‚ฌ์šฉ์ž์ธ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ™•์ธ
20
+ if User.query.filter_by(username=username).first():
21
+ # (๋‚˜์ค‘์—๋Š” ํ”Œ๋ž˜์‹œ ๋ฉ”์‹œ์ง€ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ)
22
+ return "์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."
23
+
24
+ # ์ƒˆ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”
25
+ new_user = User(username=username)
26
+ new_user.set_password(password)
27
+
28
+ # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ ๋ฐ ์ €์žฅ
29
+ db.session.add(new_user)
30
+ db.session.commit()
31
+
32
+ # ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ํ›„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
33
+ return redirect(url_for('auth.login'))
34
+
35
+ # GET ์š”์ฒญ ์‹œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์คŒ
36
+ return render_template('signup.html')
37
+
38
+
39
+ # ๋กœ๊ทธ์ธ ํŒŒํŠธ
40
+ @bp.route('/login', methods=['GET', 'POST'])
41
+ def login():
42
+ if request.method == 'POST':
43
+ username = request.form['username']
44
+ password = request.form['password']
45
+
46
+ # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
47
+ user = User.query.filter_by(username=username).first()
48
+
49
+ # ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
50
+ if user and user.check_password(password):
51
+ # ์„ธ์…˜์— ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ
52
+ session.clear()
53
+ session['user_id'] = user.id
54
+ session['username'] = user.username
55
+
56
+ # ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
57
+ return redirect(url_for('main.home'))
58
+ else:
59
+ # (๋‚˜์ค‘์—๋Š” ํ”Œ๋ž˜์‹œ ๋ฉ”์‹œ์ง€ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ)
60
+ return "๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
61
+
62
+ # GET ์š”์ฒญ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์คŒ
63
+ return render_template('login.html')
64
+
65
+ # ๋กœ๊ทธ์•„์›ƒ part
66
+ @bp.route('/logout')
67
+ def logout():
68
+
69
+ # ์„ธ์…˜์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ œ๊ฑฐ
70
+ session.clear()
71
+ # ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
72
+ return redirect(url_for('auth.login'))
src/main.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # src/main.py
2
+ # ๊ธฐ์กด app.py์—์„œ main๊ณผ ๊ด€๋ จํ•ด์„œ ๋ถ„๋ฆฌ
3
+
4
+ from flask import Blueprint, render_template, request, jsonify, session, redirect, url_for
5
+ from . import db
6
+ from .models import User, Diary
7
+ from .emotion_engine import load_emotion_classifier, predict_emotion
8
+ from .recommender import Recommender
9
+ import random
10
+
11
+ bp=Blueprint('main', __name__)
12
+
13
+ emotion_clssifier=load_emotion_classifier()
14
+ recommender=Recommender()
15
+ emotion_emoji_map={
16
+ '๊ธฐ์จ':'๐Ÿ˜„', 'ํ–‰๋ณต':'๐Ÿ˜Š', '์‚ฌ๋ž‘':'โค๏ธ',
17
+ '๋ถˆ์•ˆ':'๐Ÿ˜Ÿ', '์Šฌํ””':'๐Ÿ˜ข', '์ƒ์ฒ˜':'๐Ÿ’”',
18
+ '๋ถ„๋…ธ':'๐Ÿ˜ ', 'ํ˜์˜ค':'๐Ÿคข', '์งœ์ฆ':'๐Ÿ˜ค',
19
+ '๋†€๋žŒ':'๐Ÿ˜ฎ',
20
+ '์ค‘๋ฆฝ':'๐Ÿ˜',
21
+ '๊ณตํฌ':'๐Ÿ˜ฑ'
22
+ }
23
+
24
+ @bp.route('/')
25
+ def home():
26
+ if 'user_id' in session:
27
+ return redirect(url_for('auth.login'))
28
+ return render_template("emotion_homepage.html", username=session.get('username'))
src/models.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # models.py
2
+ # db๊ด€๋ จํ•œ ๋ชจ๋ธ ์ฝ”๋“œ
3
+ # User, Diary ๋ชจ๋ธ์ •์˜
4
+
5
+ from . import db
6
+ from werkzeug.security import generate_password_hash, check_password_hash # ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹ฑ(์•”ํ˜ธํ™”, *์ฒ˜๋ฆฌํ•ด์คŒ)
7
+ import uuid
8
+
9
+ class User(db.Model):
10
+ id = db.Column(db.String(36), primary_key=True, default =lambda :str(uuid.uuid4())) # UUID ํ˜•์‹์˜ ๊ณ ์œ  ID, ์œ ์ €๋Š” ๋ฌธ์ž์—ด๋กœ ๋„ฃ์„์ˆ˜ ์žˆ๋‹ค.
11
+ username = db.Column(db.String(80), unique=True, nullable=False) # ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์€ ํฌ๊ท€ํ•˜๊ณ , ๊ณต๋ฐฑ์€ ์—†์Œ
12
+ password_hash = db.Column(db.String(128), nullable=False) # ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•ด์‹œ๊ฐ’์œผ๋กœ ์ €์žฅ
13
+
14
+ # User๊ฐ€ ์‚ญ์ œ๋˜๋ฉด, ๊ด€๋ จ๋œ ๋ชจ๋“  Diary๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋„๋ก cascade ์˜ต์…˜ ์ถ”๊ฐ€
15
+ diaries = db.relationship('Diary', backref='author', lazy=True, cascade="all, delete-orphan")
16
+
17
+ # ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ์ €์žฅ
18
+ def set_password(self, password):
19
+ self.password_hash = generate_password_hash(password) # ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ์ €์žฅ
20
+
21
+ # ํ•ด์‹œ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋น„๊ต
22
+ def check_password(self, password):
23
+ return check_password_hash(self.password_hash, password) # ํ•ด์‹œ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋น„๊ต
24
+
25
+ # ์œ ์ € ํ˜ธ์ถœ๋ช… ํ™•์ธ
26
+ def __repr__(self):
27
+ return f"<User id={self.id} username='{self.username}'>"
28
+
29
+ class Diary(db.Model):
30
+ id = db.Column(db.String(36), primary_key=True, default =lambda :str(uuid.uuid4())) # UUID ํ˜•์‹์˜ ๊ณ ์œ  ID
31
+ user_id = db.Column(db.String(36), db.ForeignKey('user.id'), nullable=False) # ์ž‘์„ฑ์ž ID (User ๋ชจ๋ธ๊ณผ ์—ฐ๊ด€)
32
+ content = db.Column(db.Text, nullable=False) # ์ผ๊ธฐ ๋‚ด์šฉ
33
+ emotion = db.Column(db.String(20), nullable=False) # ๊ฐ์ • ๋ผ๋ฒจ
34
+ timestamp = db.Column(db.DateTime, server_default=db.func.now()) # ์ž‘์„ฑ ์‹œ๊ฐ„ (๊ธฐ๋ณธ๊ฐ’: ํ˜„์žฌ ์‹œ๊ฐ„)
35
+
36
+ user = db.relationship('User', backref=db.backref('diaries', lazy=True)) # User ๋ชจ๋ธ๊ณผ์˜ ๊ด€๊ณ„ ์„ค์ •
37
+
38
+