1
- from flask import Flask , render_template
2
- from flask_login import LoginManager
3
- from models import db , User , APIProvider , AIModel
4
- from blueprints .auth import auth_bp
5
- from blueprints .core import core_bp
6
- from blueprints .generate import generate_bp
7
- from blueprints .gallery import gallery_bp
8
- from blueprints .download import download_bp
9
- from blueprints .admin import admin
1
+ from flask import Flask , render_template , jsonify , request
2
+ from extensions import db , login_manager , limiter , get_rate_limit_string
10
3
import os
11
4
from dotenv import load_dotenv
12
5
@@ -18,7 +11,7 @@ def create_app():
18
11
19
12
# Configuration
20
13
app .config ['SECRET_KEY' ] = os .getenv ('SECRET_KEY' )
21
- app .config ['SQLALCHEMY_DATABASE_URI' ] = ' sqlite:///sketchmaker.db'
14
+ app .config ['SQLALCHEMY_DATABASE_URI' ] = os . getenv ( 'DB_PATH' , ' sqlite:///sketchmaker.db')
22
15
app .config ['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
23
16
24
17
# Ensure required environment variables are set
@@ -29,94 +22,127 @@ def create_app():
29
22
30
23
# Initialize extensions
31
24
db .init_app (app )
32
- login_manager = LoginManager ()
33
- login_manager .login_view = 'auth.login'
25
+ limiter .init_app (app )
34
26
login_manager .init_app (app )
35
-
36
- # Create database tables and initialize providers
37
- with app .app_context ():
38
- db .create_all ()
39
- init_api_providers (app )
40
-
41
- # Register blueprints
42
- app .register_blueprint (auth_bp )
43
- app .register_blueprint (core_bp )
44
- app .register_blueprint (generate_bp )
45
- app .register_blueprint (gallery_bp )
46
- app .register_blueprint (download_bp )
47
- app .register_blueprint (admin )
48
-
49
- # Error handlers
50
- @app .errorhandler (404 )
51
- def page_not_found (e ):
52
- return render_template ('404.html' ), 404
53
-
54
- # User loader
55
- @login_manager .user_loader
56
- def load_user (user_id ):
57
- return db .session .get (User , int (user_id ))
58
-
59
- return app
60
27
61
- def init_api_providers (app ):
62
- """Initialize default API providers and models"""
63
28
with app .app_context ():
64
- # Only initialize if no providers exist
65
- if APIProvider .query .first () is None :
66
- # Create providers
67
- openai = APIProvider (name = "OpenAI" )
68
- anthropic = APIProvider (name = "Anthropic" )
69
- gemini = APIProvider (name = "Google Gemini" )
70
- groq = APIProvider (name = "Groq" )
71
- db .session .add_all ([openai , anthropic , gemini , groq ])
72
- db .session .commit ()
29
+ # Import models here to avoid circular imports
30
+ from models import User , APIProvider , AIModel
31
+
32
+ # Import blueprints
33
+ from blueprints .auth import auth_bp
34
+ from blueprints .core import core_bp
35
+ from blueprints .generate import generate_bp
36
+ from blueprints .gallery import gallery_bp
37
+ from blueprints .download import download_bp
38
+ from blueprints .admin import admin
39
+
40
+ # Register blueprints
41
+ app .register_blueprint (auth_bp )
42
+ app .register_blueprint (core_bp )
43
+ app .register_blueprint (generate_bp )
44
+ app .register_blueprint (gallery_bp )
45
+ app .register_blueprint (download_bp )
46
+ app .register_blueprint (admin )
47
+
48
+ # Error handlers
49
+ @app .errorhandler (404 )
50
+ def page_not_found (e ):
51
+ return render_template ('errors/404.html' ), 404
73
52
74
- # OpenAI models
75
- openai_models = [
76
- "gpt-4o" ,
77
- "gpt-4o-mini" ,
78
- "o1-preview" ,
79
- "o1-mini"
80
- ]
81
- for model in openai_models :
82
- db .session .add (AIModel (name = model , provider_id = openai .id ))
53
+ @app .errorhandler (429 )
54
+ def ratelimit_handler (e ):
55
+ # Default retry time of 60 seconds if not provided
56
+ retry_after = getattr (e , 'retry_after' , 60 )
57
+ if retry_after is None :
58
+ retry_after = 60
83
59
84
- # Anthropic models
85
- anthropic_models = [
86
- "claude-3-5-sonnet-20241022" ,
87
- "claude-3-5-haiku-20241022" ,
88
- "claude-3-opus-20240229" ,
89
- "claude-3-haiku-20240307"
90
- ]
91
- for model in anthropic_models :
92
- db .session .add (AIModel (name = model , provider_id = anthropic .id ))
60
+ # For API endpoints, return JSON response
61
+ if request .path .startswith ('/api/' ):
62
+ return jsonify ({
63
+ "error" : "Rate limit exceeded" ,
64
+ "message" : "Too many requests. Please try again later." ,
65
+ "retry_after" : retry_after
66
+ }), 429
67
+
68
+ # For web pages, render template
69
+ return render_template ('errors/429.html' ,
70
+ retry_after = retry_after
71
+ ), 429
93
72
94
- # Google Gemini models
95
- gemini_models = [
96
- "gemini-1.5-flash-002" ,
97
- "gemini-1.5-flash-exp-0827" ,
98
- "gemini-1.5-flash-8b-exp-0827" ,
99
- "gemini-1.5-pro-002" ,
100
- "gemini-1.5-pro-exp-0827"
101
- ]
102
- for model in gemini_models :
103
- db .session .add (AIModel (name = model , provider_id = gemini .id ))
73
+ @app .errorhandler (500 )
74
+ def internal_server_error (e ):
75
+ return render_template ('errors/500.html' ), 500
76
+
77
+ # User loader
78
+ @login_manager .user_loader
79
+ def load_user (user_id ):
80
+ return db .session .get (User , int (user_id ))
104
81
105
- # Groq models
106
- groq_models = [
107
- "llama-3.1-70b-versatile" ,
108
- "llama-3.1-8b-instant" ,
109
- "llama-3.2-11b-text-preview" ,
110
- "llama-3.2-11b-vision-preview" ,
111
- "llama-3.2-1b-preview" ,
112
- "llama-3.2-3b-preview" ,
113
- "llama-3.2-90b-text-preview" ,
114
- "llama-3.2-90b-vision-preview"
115
- ]
116
- for model in groq_models :
117
- db .session .add (AIModel (name = model , provider_id = groq .id ))
82
+ def init_api_providers ():
83
+ """Initialize default API providers and models"""
84
+ # Only initialize if no providers exist
85
+ if APIProvider .query .first () is None :
86
+ # Create providers
87
+ openai = APIProvider (name = "OpenAI" )
88
+ anthropic = APIProvider (name = "Anthropic" )
89
+ gemini = APIProvider (name = "Google Gemini" )
90
+ groq = APIProvider (name = "Groq" )
91
+ db .session .add_all ([openai , anthropic , gemini , groq ])
92
+ db .session .commit ()
118
93
119
- db .session .commit ()
94
+ # OpenAI models
95
+ openai_models = [
96
+ "gpt-4o" ,
97
+ "gpt-4o-mini" ,
98
+ "o1-preview" ,
99
+ "o1-mini"
100
+ ]
101
+ for model in openai_models :
102
+ db .session .add (AIModel (name = model , provider_id = openai .id ))
103
+
104
+ # Anthropic models
105
+ anthropic_models = [
106
+ "claude-3-5-sonnet-20241022" ,
107
+ "claude-3-5-haiku-20241022" ,
108
+ "claude-3-opus-20240229" ,
109
+ "claude-3-haiku-20240307"
110
+ ]
111
+ for model in anthropic_models :
112
+ db .session .add (AIModel (name = model , provider_id = anthropic .id ))
113
+
114
+ # Google Gemini models
115
+ gemini_models = [
116
+ "gemini-1.5-flash-002" ,
117
+ "gemini-1.5-flash-exp-0827" ,
118
+ "gemini-1.5-flash-8b-exp-0827" ,
119
+ "gemini-1.5-pro-002" ,
120
+ "gemini-1.5-pro-exp-0827"
121
+ ]
122
+ for model in gemini_models :
123
+ db .session .add (AIModel (name = model , provider_id = gemini .id ))
124
+
125
+ # Groq models
126
+ groq_models = [
127
+ "llama-3.1-70b-versatile" ,
128
+ "llama-3.1-8b-instant" ,
129
+ "llama-3.2-11b-text-preview" ,
130
+ "llama-3.2-11b-vision-preview" ,
131
+ "llama-3.2-1b-preview" ,
132
+ "llama-3.2-3b-preview" ,
133
+ "llama-3.2-90b-text-preview" ,
134
+ "llama-3.2-90b-vision-preview"
135
+ ]
136
+ for model in groq_models :
137
+ db .session .add (AIModel (name = model , provider_id = groq .id ))
138
+
139
+ db .session .commit ()
140
+
141
+ # Create database tables and initialize providers
142
+ db .create_all ()
143
+ init_api_providers ()
144
+
145
+ return app
120
146
121
147
# Create the application instance for gunicorn
122
148
app = create_app ()
0 commit comments