refactor: split monolithic app.py into modular Flask application with factory pattern
- Created app/ package with 6 modules: - __init__.py: Application factory (create_app function) - routes.py: All route handlers (473 lines) - models.py: Data persistence layer (41 lines) - validators.py: Input validation functions (48 lines) - email_service.py: Email sending functions (85 lines) - utils.py: Utility functions (30 lines) - Implemented Flask application factory pattern - Created run.py as minimal entry point - Updated all test imports to use new module structure - Fixed template/static folder paths for package structure - All 102 tests passing - Improved maintainability with clear separation of concerns - Follows Flask best practices for scalable applications
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
"""
|
||||
Utility functions for the Flask job application system.
|
||||
"""
|
||||
from datetime import datetime
|
||||
from flask import session, current_app
|
||||
|
||||
|
||||
def check_rate_limit():
|
||||
"""
|
||||
Check if user is submitting forms too quickly.
|
||||
Returns (allowed: bool, wait_seconds: int)
|
||||
"""
|
||||
now = datetime.now()
|
||||
last_submit_str = session.get('last_submission_time')
|
||||
|
||||
if last_submit_str:
|
||||
try:
|
||||
last_submit = datetime.fromisoformat(last_submit_str)
|
||||
elapsed = (now - last_submit).total_seconds()
|
||||
|
||||
if elapsed < current_app.config['RATE_LIMIT_SECONDS']:
|
||||
wait_seconds = int(current_app.config['RATE_LIMIT_SECONDS'] - elapsed) + 1
|
||||
return False, wait_seconds
|
||||
except (ValueError, TypeError):
|
||||
# Invalid timestamp, allow submission
|
||||
pass
|
||||
|
||||
# Update last submission time
|
||||
session['last_submission_time'] = now.isoformat()
|
||||
return True, 0
|
||||
Reference in New Issue
Block a user