1
1
from flask import Flask , request , jsonify , send_file , render_template
2
+ from flask_limiter import Limiter
3
+ from flask_limiter .util import get_remote_address
2
4
from datetime import datetime
3
5
import cv2
4
6
import dlib
17
19
# Create Flask app
18
20
app = Flask (__name__ )
19
21
22
+ # Create rate limiter
23
+ limiter = Limiter (
24
+ get_remote_address ,
25
+ app = app ,
26
+ default_limits = ["1 per second" , "10 per minute" , "1000 per day" ],
27
+ storage_uri = os .getenv ("mongo_url" ),
28
+ )
29
+
30
+ # Set the key function
31
+ limiter .key_func = lambda : request .remote_addr
32
+
20
33
# Connect to MongoDB and create TTL index for jobs collection
21
34
client = MongoClient (os .getenv ("mongo_url" ))
22
35
db = client [os .getenv ("mongo_db" )]
23
36
24
37
# Create TTL index for jobs collection with expiration after one hour
25
38
expire_after = int (os .getenv ("mongo_job_expire_after" ))
26
- if expire_after is not 0 :
39
+
40
+ # Check if the TTL index exists and has the same expiration time
41
+ existing_index_info = db .jobs .index_information ()
42
+ if (
43
+ "created_at_1" not in existing_index_info
44
+ or existing_index_info ["created_at_1" ]["expireAfterSeconds" ] != expire_after
45
+ ):
46
+ # If the index doesn't exist or has a different expiration time, delete and recreate it
47
+ if "created_at_1" in existing_index_info :
48
+ db .jobs .drop_index ("created_at_1" )
49
+
27
50
db .jobs .create_index ("created_at" , expireAfterSeconds = expire_after )
28
51
29
52
# Create GridFS object
@@ -122,12 +145,14 @@ def process_image(image):
122
145
123
146
124
147
@app .route ("/" , methods = ["GET" ])
148
+ @limiter .exempt
125
149
def index ():
126
150
"""Render the index.html template"""
127
151
return render_template ("index.html" )
128
152
129
153
130
154
@app .route ("/overlay" , methods = ["POST" ])
155
+ @limiter .limit ("10 per minute" , override_defaults = False )
131
156
def overlay ():
132
157
"""Process an image and return the processed image and data"""
133
158
try :
@@ -177,6 +202,7 @@ def overlay():
177
202
178
203
179
204
@app .route ("/jobs/<job_id>" , methods = ["GET" ])
205
+ @limiter .exempt
180
206
def get_job (job_id ):
181
207
"""Get a job by its ID"""
182
208
try :
@@ -189,6 +215,7 @@ def get_job(job_id):
189
215
190
216
191
217
@app .route ("/jobs/<job_id>/result_image.png" , methods = ["GET" ])
218
+ @limiter .limit ("20 per minute" )
192
219
def get_result_image (job_id ):
193
220
"""Get the result image of a job by its ID"""
194
221
try :
0 commit comments