WebashalarForML's picture
Upload 42 files
fad436e verified
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)))