import os import logging from flask import Flask, render_template, request, redirect, url_for, flash, session, send_from_directory from utility.utils import process_image_pipeline from dotenv import load_dotenv # Load environment variables load_dotenv() # Configure logging logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()]) app = Flask(__name__) app.secret_key = os.getenv('SECRET_KEY', 'default_secret_key') app.config['UPLOAD_FOLDER'] = 'static/uploads/' app.config['RESULT_FOLDER'] = 'static/results/' os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) os.makedirs(app.config['RESULT_FOLDER'], exist_ok=True) @app.template_filter('basename') def basename_filter(path): return os.path.basename(path) @app.route('/') def index(): uploaded_files = session.get('uploaded_files', []) return render_template('index.html', uploaded_files=uploaded_files) @app.route('/upload', methods=['POST']) def upload_file(): logging.info("Request: /upload received") if 'files' not in request.files: logging.warning("Upload: No file part in request") flash('No file part') return redirect(request.url) files = request.files.getlist('files') if not files or all(file.filename == '' for file in files): logging.warning("Upload: No files selected") flash('No selected files') return redirect(request.url) uploaded_files = [] for file in files: if file: filename = file.filename file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) uploaded_files.append(filename) logging.info(f"Upload: Successfully saved {filename}") session['uploaded_files'] = uploaded_files return process_file() @app.route('/process', methods=['GET', 'POST']) def process_file(): logging.info("Request: /process started") uploaded_files = session.get('uploaded_files', []) if not uploaded_files: logging.warning("Process: No files in session") flash('No files selected for processing') return redirect(url_for('index')) file_paths = [os.path.join(app.config['UPLOAD_FOLDER'], f) for f in uploaded_files] try: logging.info(f"Process: Sending {len(file_paths)} files to pipeline") processed_data = process_image_pipeline(file_paths) # Format images for result.html processed_Img = {f: os.path.join(app.config['UPLOAD_FOLDER'], f) for f in uploaded_files} session['processed_data'] = processed_data session['processed_Img'] = processed_Img logging.info("Process: Pipeline completed successfully") flash('Data processed successfully') return redirect(url_for('result')) except Exception as e: logging.exception(f"Process: Critical failure: {e}") flash(f'Processing error: {str(e)}') return redirect(url_for('index')) @app.route('/result') def result(): data = session.get('processed_data', {}) Img = session.get('processed_Img', {}) if not data: return redirect(url_for('index')) return render_template('result.html', data=data, Img=Img) @app.route('/reset_upload') def reset_upload(): uploaded_files = session.get('uploaded_files', []) for f in uploaded_files: path = os.path.join(app.config['UPLOAD_FOLDER'], f) if os.path.exists(path): os.remove(path) session.pop('uploaded_files', None) session.pop('processed_data', None) session.pop('processed_Img', None) flash('System reset successful.') return redirect(url_for('index')) if __name__ == '__main__': from utility.utils import get_ocr, get_ner logging.info("Core: Pre-initializing engines (this may take a minute)...") # Trigger lazy load at startup to avoid reloader issues and request timeouts try: get_ocr() get_ner() logging.info("Core: Engines pre-initialized successfully.") except Exception as e: logging.error(f"Core: Failed to pre-initialize engines: {e}") app.run(debug=True, use_reloader=False, port=int(os.getenv('PORT', 5000)))