import os import re import uuid import time import dlib import simplejson as json import numpy as np from flask import Blueprint, request, jsonify from PIL import Image # todo: try to remove PIL dependency # from app.models.sql_factory import load_sql_datasets, list_datasets, get_dataset, get_table # from app.utils.im_utils import pil2np from celery.result import AsyncResult from app.server.tasks import celery from app.server.tasks import task_lookup, list_active_tasks api_task = Blueprint('api_task', __name__) @api_task.route('/') def index(): """List active tasks""" return jsonify(list_active_tasks) # from flask import render_template, redirect, url_for, send_from_directory # from flask import request, make_response, jsonify # from . import main, utils # from PIL import Image, ImageOps # import cv2 as cv # import imutils @api_task.route('//') def task_status(task_name, task_id): """Return celery image processing status""" if task_name in task_lookup: task = task_lookup[task_name]['task'].AsyncResult(task_id) # task = AsyncResult(task_id, app=celery) else: return jsonify({ 'state': 'error', 'percent': 100, 'message': 'Unknown task' }) # app.logger.info('task state: {}'.format(task.state)) if task.state == 'PENDING': response = { 'state': task.state, 'percent': 0, 'message': 'Pending...' } elif task.state != 'FAILURE': response = { 'state': task.state, 'percent': task.info.get('percent', 0), 'uuid': task.info.get('uuid', 0), 'message': task.info.get('message', '') } if 'result' in task.info: response['result'] = task.info['result'] else: # something went wrong in the background job response = { 'state': task.state, 'percent': 100, 'message': str(task.info), # this is the exception raised } return jsonify(response) @api_task.route('/upload/sleep', methods=['GET', 'POST']) def sleep_test(): async_task = task_lookup['sleep']['task'].apply_async(args=['sleep_test']) task_url = '/task/{}/{}'.format('sleep', async_task.id) return jsonify({ 'result': True, 'task_url': task_url, }) @api_task.route('/upload', methods=['POST']) def upload(): style = request.form['style'] print('style',style) if style in task_lookup: task = task_lookup[style]['task'] print('task',task) else: return jsonify({ 'result': False, 'error': 'Unknown task', }) file = request.files['user_image'] ext = request.form['ext'] if ext is None: ext = request.files['ext'] uuid_name = str(uuid.uuid4()) app.logger.info('[+] style: {}'.format(style)) app.logger.info('[+] ext: {}'.format(ext)) app.logger.info('[+] uuid_name: {}'.format(uuid_name)) # convert PNG to JPG print('[+] Resizing image') # LOL MaskRCNN needs to be run outside of the Celery Task im = Image.open(file.stream).convert('RGB') im = ImageOps.fit(im,(512,512)) # # Save image to disk # print('[+] Save image to {}'.format(fpath)) # im.save(fpath, 'JPEG', quality=100) # im_pil_256 = im.resize((256,256)) print('[+] ensure_np...') im_np = imx.ensure_np(im_pil_256) celery_result = { } print('[+] Start celery') async_task = task.apply_async(args=[uuid_name, celery_result]) task_url = '/task/{}/{}'.format(style, async_task.id) return jsonify({ 'result': True, 'task_url': task_url, 'uuid': uuid_name })