2015-07-29 3 views
2

Я немного смущен о том, как продолжить работу с моей программой. У меня есть представление django, в котором пользователю предлагается ввести имя и фамилию, а затем перейти к задаче celery, которая обрабатывает данные и сохраняет их в базе данных. Теперь, когда задача обрабатывается, я хочу, чтобы анимированный gif отображался, чтобы пользователь знал, что что-то происходит. (Я где-то читал здесь, в SO, что анимированный gif лучше), тогда, если задача будет выполнена, она будет перенаправлена на страницу, которая сообщает пользователю, что процесс завершен. Я сделал свое исследование и выяснил, что должен получить task_id и отправить его на запрос ajax.Использование Ajax с задачей сельдерея

Моя проблема заключается в использовании ajax. Как я могу получить task_id из ajax? Или передайте task_id в запрос ajax.


EDIT: ** Я знаю, что это неполно. ОЧЕНЬ НЕПОСРЕДСТВЕННО **

Вот некоторые из моих кодов. Это не делает многого, потому что я все еще должен понять концепцию использования ajax. Но я хочу, когда я отправлю форму, появится spinner gif, и в то же время сельдерей будет обрабатывать мои задачи. Когда сельдерей будет обрабатывать задание, он перенаправляется на страницу, где говорится «Успех» или что-то еще.

views.py:

def addUser(request): 
    if request.method == 'POST': 
     addUser = userform(request.POST) 
     if addUser.is_valid(): 
      task = create_user.apply_async((addUser.cleaned_data,), countdown=20) 
     return render_to_response('loading.html', {'task_id': task.task_id}) 
    else: 
     addUser = userform() 
    return render(request, 'addUser.html', {'addUser':addUser}) 

addUser.html

<form method="POST"> 
    {% csrf_token %} 
    {{ addUser }} 
    <input type="submit" value="Submit"> 
</form> 

loading.html

<html> 
<script> 
<head> 
<script src="{{ STATIC_URL }}js/jquery-ui.min.js"></script> 
<script type="text/javascript"> 
var formData = task_id; // task id of my celery task 

$.ajax({ 
    url : "templates/success.html", //from what I know, this URL is where the AJAX will go after processing 
    type: "POST", 
    data : formData, 
    success: function(data, textStatus, jqXHR) 
    { 
     alert("Success") 
    }, 
    error: function (jqXHR, textStatus, errorThrown) 
    { 
     alert("Failed") 
    } 
}); 
</script> 

</head> 

<body><center> 
    {% load static %} 
    <img src="{% static 'images/ripple.gif' %}" alt="Hi!" height="150" width="150" /> 
    </center> 
</body> 
</html> 

tasks.py

@task(ignore_result=True) 
def create_user(data): 
    user = UserInfo(fname=data['fname'], lname=data['lname']) 
    user.save() 
    return None 

Я не уверен, где AJAX будет идти, если это в form(addUser.html) или в loading.html

Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо вам за помощь!

ответ

3

Идея состоит в том, чтобы запустить долговременную задачу, когда вы ее выполняете, она возвращает объект AsyncResult, вы должны получить «task_id» и вернуть его клиенту. Клиентская сторона (javascript) будет делать запрос GET, например,/check_status/и передавать «task_id» на сервер. Сервер попросит сельдерей использовать этот task_id и вернуться к клиенту, если задача завершена или нет.

def view_with_task(request): 
    #your code 
    # send the task to the worker and get the task_id 
    async_result = your_task.delay() 
    #code 
    ctx = {} 
    ctx['task_id'] = async_result.task_id 
    return render(tpl, ctx) 

from celery import AsyncResult 
def check_status(request): 
    task_id = request.GET.get('task_id') 
    if task_id: 
     async_result = AsyncResult(task_id) 
     return Jsonresponse({'finish': async_result.ready()}) 
    return JsonResponse({'finish': False}) 

Кстати, есть project сделать это без боли и не слишком много кода. Thanks

+0

Благодарим за отзыв! Эта часть - это то, что я хочу знать. «Клиентская сторона (javascript) могла бы сделать запрос GET, например,/check_status/и передать« task_id »на сервер.« Я видел примеры, но ни один из них не показал мне, как это сделать на стороне клиента. Я проверил ссылку, которую вы предоставили, и я увидел, что она известна только для работы с django 1.3-1.5. Возможно ли это работать с 1.8? – predator

+1

Нет проблем :). Этот проект нацелен на использование этого [link] (https://github.com/PolicyStat/jquery-celery/blob/master/src/celery.js#L54) для Javascript. Я думаю, что они должны работать с django1.8 havent, используемым с этой версией. Однако вы можете взглянуть на эту ссылку, которую я только что написал, и посмотреть, как работает javascript, для серверной стороны у вас уже есть идея (с учетом «task_id» вы можете получить информацию о сельдерее, связанную с этой задачей = D). Таким образом, вы можете сделать это сами или попробовать эти библиотеки вместе. Дайте мне знать, как все идет, спасибо! –

+0

О, мой. Я думаю, что это то, что я ищу. Я попробую и вернусь к вам, если все будет хорошо. – predator

Смежные вопросы