Celeryを参照すると、ジョブを作成して監視することができます。これにより、process(request)
が置き換えられます。独自のprocess(request)
を使用すると、それを自分で実装しなければならないでしょうし、それに対するソリューションがすでに存在するのであれば、なぜそうするのでしょうか?
実行中のサブプロセスの状態は、ブラウザ(AJAX)からのJSを使用して、このように照会することができます。プロセスをトリガーするビューで
def task_progress_json(request, job_id):
"""
A view to report the progress to the user
:param job_id:
:param request:
"""
job = AsyncResult(job_id)
data = job.result or job.state
if job.state == states.FAILURE or isinstance(data, Exception):
data = {'failure': "{}: {}".format(_('Error'), data)}
if job_id in request.session:
request.session[job_id] = None
else:
# see http://docs.celeryproject.org/en/latest/reference/celery.states.html#std:state-PROPAGATE_STATES
# and http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#calling-tasks
if data == states.PENDING:
last_state = request.session.get(job_id, None)
if last_state == states.PENDING:
data = {'failure': "Error: No Job Running"}
request.session[job_id] = None
else:
request.session[job_id] = data
if isinstance(data, dict):
next_url = data.pop('next_url', None)
next_kwargs = data.pop('next_kwargs', {})
if next_url:
data['next_url'] = reverse(next_url, kwargs=next_kwargs)
return HttpResponse(json.dumps(data), content_type='application/json')
、例えば、ユーザがのSubmit
ボタンをクリックしたときフォームを起動すると、ジョブを開始します。
def form_valid(self, form):
# this is just an example, implement as you like
fs = FileSystemStorage(location=settings.IMAGE_ROOT)
stored_file = fs.save(form.cleaned_data['file'].name, form.cleaned_data['file'])
job = import_imag_task.delay(stored_file, self.request.user.id, self.spectre.id)
# this is another view that shows the progress bar
# the process of the progress bar is displayed according to
# results fetched from the above task_progress_json request via AJAX
return HttpResponseRedirect(reverse('import_image_progress') + '?job=' + job.id)
webappにこのように動作させる場合、ajaxを回避する方法はありません。だからあなたはその技術に精通しているべきです。 – Jingo