from datetime import datetime import json from pathlib import Path from flask import Flask, request, render_template from form_content import FormContent from utils import get_data_stats app = Flask(__name__) save_path = Path('data.json') data_cache = { entry['email']: entry for entry in json.loads(save_path.read_text()) }\ if save_path.exists() else {} stats_cache = get_data_stats(data_cache) MAX_FILE_SIZE = 1_000_000 MAX_REQUEST_LENGTH = 1_000 @app.route('/') def form(): return render_template('form.html', times=FormContent.times, topics=FormContent.topics, background=FormContent.background, languages=FormContent.languages) @app.route('/submit', methods=['POST']) def submit(): if save_path.exists() and save_path.stat().st_size > MAX_FILE_SIZE: return { 'error': 'Database full.' }, 500 if len(request.data) > MAX_REQUEST_LENGTH: return { 'error': 'Request too long.' }, 400 data = request.get_json() if set(data) != FormContent.all_keys: return { 'error': 'Invalid request format.' }, 400 data['date_submitted'] = datetime.strftime(datetime.now(), '%Y/%m/%d, %H:%M:%S') data_cache[data['email']] = data save_path.write_text(json.dumps(list(data_cache.values()), indent='\t')) global stats_cache stats_cache = get_data_stats(data_cache) return {}, 200 @app.route('/stats') def stats(): return render_template('stats.html', times=FormContent.times, topics=FormContent.topics, background=FormContent.background, languages=FormContent.languages, data=stats_cache) if __name__ == '__main__': app.run(host='0.0.0.0', port=9700, debug=False)