File size: 2,387 Bytes
e221c83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
import os

db = SQLAlchemy()
login_manager = LoginManager()
login_manager.login_view = 'auth.login' 

def create_app():
    app = Flask(__name__, static_folder='templates/static')
    
    # 1. ์„ค์ •
    app.config['SECRET_KEY'] = 'a-very-long-and-unique-secret-key-for-this-app'
    app.config['SESSION_COOKIE_SAMESITE'] = 'None'
    app.config['SESSION_COOKIE_SECURE'] = True
    
    db_uri = os.environ.get('DATABASE_URL')
    if not db_uri:
        db_uri = "sqlite:///emotion.db"

    if db_uri and db_uri.startswith("postgres://"):
        db_uri = db_uri.replace("postgres://", "postgresql://", 1)
    
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['TEMPLATES_AUTO_RELOAD'] = True

    # SQLAlchemy ์—”์ง„ ์˜ต์…˜ ์„ค์ • (pgbouncer Session ๋ชจ๋“œ ํ˜ธํ™˜)
    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
        "pool_size": 15,  # pgbouncer์˜ pool_size์™€ ์ผ์น˜์‹œํ‚ค๊ฑฐ๋‚˜ ๋” ์ž‘๊ฒŒ ์„ค์ •
        "max_overflow": 5, # pool_size ์ดˆ๊ณผ ์‹œ ์ž„์‹œ๋กœ ์—ด ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ ์ˆ˜
        "pool_recycle": 3600, # 1์‹œ๊ฐ„๋งˆ๋‹ค ์—ฐ๊ฒฐ ์žฌํ™œ์šฉ (์˜ค๋ž˜๋œ ์—ฐ๊ฒฐ ๋ฐฉ์ง€)
        "pool_pre_ping": True, # ์—ฐ๊ฒฐ ์‚ฌ์šฉ ์ „ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
        "pool_timeout": 30, # ์—ฐ๊ฒฐ ํ’€์—์„œ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ (์ดˆ)
        # pgbouncer Session ๋ชจ๋“œ์—์„œ๋Š” 'rollback'์ด ๊ธฐ๋ณธ๊ฐ’์ด๋ฏ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋จ
        # "pool_reset_on_return": 'rollback' 
    }

    # ๋กœ๊น… ์„ค์ •
    import logging
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    
    # 2. DB ์ดˆ๊ธฐํ™” ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    db.init_app(app)
    with app.app_context():
        from . import models
        db.create_all()

    @app.teardown_appcontext
    def shutdown_session(exception=None):
        db.session.remove()

   # 3. AI ๋ชจ๋ธ ๋กœ๋”ฉ
    from .emotion_engine import load_emotion_classifier
    # ์•ฑ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๊ณ  app ๊ฐ์ฒด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    with app.app_context():
        app.emotion_classifier = load_emotion_classifier()
        


    # 5. ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ๋“ฑ๋ก
    from . import main, auth
    app.register_blueprint(main.bp)
    app.register_blueprint(auth.bp)

    return app