python - Celery task in Flask for uploading and resizing images and storing it to Amazon S3 -
i'm trying create celery task uploading , resizing image before storing amazon s3. doesn't work expected. without task working fine. code far:
stacktrace
traceback (most recent call last): file "../myve/lib/python2.7/site-packages/kombu/messaging.py", line 579, in _receive_callback decoded = none if on_m else message.decode() file "../myve/lib/python2.7/site-packages/kombu/transport/base.py", line 147, in decode self.content_encoding, accept=self.accept) file "../myve/lib/python2.7/site-packages/kombu/serialization.py", line 187, in decode return decode(data) file "../myve/lib/python2.7/site-packages/kombu/serialization.py", line 74, in pickle_loads return load(bytesio(s)) file "../myve/lib/python2.7/site-packages/werkzeug/datastructures.py", line 2595, in __getattr__ return getattr(self.stream, name) file "../myve/lib/python2.7/site-packages/werkzeug/datastructures.py", line 2595, in __getattr__ return getattr(self.stream, name) ... runtimeerror: maximum recursion depth exceeded while calling python object views.py
from pil import image flask import blueprint, redirect, render_template, request, url_for myapplication.forms import uploadform myapplication.tasks import upload_task main = blueprint('main', __name__) @main.route('/upload', methods=['get', 'post']) def upload(): form = uploadform() if form.validate_on_submit(): upload_task.delay(form.title.data, form.description.data, image.open(request.files['image'])) return redirect(url_for('main.index')) return render_template('upload.html', form=form) tasks.py
from stringio import stringio flask import current_app myapplication.extensions import celery, db myapplication.helpers import resize, s3_upload myapplication.models import myobject @celery.task(name='tasks.upload_task') def upload_task(title, description, source): stream = stringio() target = resize(source, current_app.config['size']) target.save(stream, 'jpeg', quality=95) stream.seek(0) obj = myobject(title=title, description=description, url=s3_upload(stream)) db.session.add(obj) db.session.commit() thank you
it looks attempting pass entire uploaded file part of celery message. imagine causing trouble. recommend seeing if can save file web server part of view, have message (the "delay" argument) contain filename rather entire file's data. task can read file in hard drive, upload s3, delete locally.
Comments
Post a Comment