2011-12-08 24 views
8

Tôi đang xây dựng cổng báo cáo bằng django. Trong cổng thông tin này, tôi cần cung cấp cho người dùng khả năng lập lịch báo cáo để chạy trên cơ sở reoccurring. Tôi đã nghiên cứu django-cần tây và hiểu rằng bạn có thể sử dụng decorator_task decorator để lên lịch một nhiệm vụ tái diễn nhưng trong tất cả các ví dụ tôi đã thấy thông tin lịch biểu cron là khó mã hóa vào trang trí.Lập lịch biểu tác vụ bằng django-celery dựa trên đầu vào của người dùng

@periodic_task(run_every=crontab(hours=7, minute=30, day_of_week="mon")) 

Có cách nào sử dụng django-cần tây để lên lịch một tác vụ lặp lại động dựa trên đầu vào từ người dùng không?

Ví dụ: người dùng sử dụng biểu mẫu để chọn báo cáo họ muốn chạy, cung cấp tất cả thông số được yêu cầu bởi báo cáo và lịch biểu khi họ muốn chạy báo cáo. Một khi tôi đã xử lý các hình thức là có một phương pháp hoặc chức năng tôi có thể gọi để thêm một nhiệm vụ run_report cho một lịch trình? Nếu có thì có cách nào để lấy tất cả các lịch biểu hiện tại được lưu trữ trong cơ sở dữ liệu để chúng có thể được hiển thị không?

+0

cách khác, bạn có thể lên lịch một tác vụ duy nhất, lần lượt là ... – DanJ

+0

Điều gì sẽ xảy ra nếu một hàm bên trong được tạo và áp dụng trang trí '@ periodic_task' với đối tượng' crontab' được tạo động? Tôi có cùng một vấn đề, có thể điều này sẽ giúp ích gì? –

+0

Tôi có cùng một vấn đề. Bất kỳ thông tin nào về cách bạn giải quyết nó? – Jannis

Trả lời

1

Tak xem djcelery trong admin-giao diện: http://localhost:8000/admin/djcelery/

Hãy thử nếu bạn có thể xây dựng các yêu cầu nhiệm vụ thiết lập ở đó (sử dụng crontabs/chu kỳ/nhiệm vụ tuần hoàn) Nếu có có một cơ hội lớn mà bạn có thể xây dựng điều này một cách nhanh chóng ..

0

Ghi đè phương thức lưu của bạn trong các mô hình. Bất cứ khi nào người dùng nhập thích để bắt đầu một quá trình/nhiệm vụ, anh ta sẽ sửa đổi mô hình kích hoạt nhiệm vụ để bắt đầu.

your_app/models.py:

class My_Model(models.Model): 
customer = models.ForeignKey(User, related_name='original_customer_id') 
start_task = models.BooleanField(default=False, blank=True) 

def save(self, *args, **kwargs): 
    super(NewProject, self).save(*args, **kwargs) 
    from .tasks import my_task 
    my_task.apply_async(args=[self.pk, self.status, self.file_type],) 

your_app/tasks.py

@celery.task() 
def my_task(foo, bar): 
    #do something 
1

http://celery.readthedocs.org/en/latest/userguide/calling.html

ví dụ như: -

from celery import task 

@task.task(ignore_result=True) 
def T(message=None): 
    print message 

.

T.apply_async(countdown=10, message="hi") 

thực hiện 10 giây kể từ bây giờ.

T.apply_async(eta=now + timedelta(seconds=10),message="hi") 

thực hiện 10 giây từ bây giờ, specifed sử dụng eta

T.apply_async(countdown=60, expires=120,message="hi") 

thực hiện trong một phút từ bây giờ, nhưng hết hạn sau 2 phút.

Các vấn đề liên quan