簡體   English   中英

如何從 views.py 繼承 django class 方法到 tasks.py 來安排 Celery 的作業?

[英]How to inherit a django class method from views.py into tasks.py to schedule jobs with Celery?

我正在嘗試使用 django 和 Celery 來安排工作。 問題是我無法讓 tasks.py 中的 @shared_task function 從 views.py 繼承 class 方法。 我將 Celery 與 Flower 和 Beat 一起安裝,當我在 tasks.py 中編寫一個獨立的 function 時,配置運行良好。 您對如何解決這個 inheritance 挑戰有什么建議嗎? 謝謝你的幫助。

我的觀點.py

from rest_framework import generics
from .serializers import TickerSerializer
from ticker.models import Ticker
import requests
import logging
from itertools import chain
from importlib import reload
import sys


logger = logging.getLogger(__name__)

class TickerList(generics.ListAPIView):
    serializer_class = TickerSerializer
    queryset = Ticker.objects.all()
    
class TickerRetrieve(generics.RetrieveAPIView):
    serializer_class = TickerSerializer
    queryset = Ticker.objects.all()
    lookup_field = 'id'   
    
    def get_object(request, **args):
        url = 'https://api.kraken.com/0/public/Ticker?pair=1INCHEUR,1INCHUSD'
        response = requests.get(url)
        data = response.json()
        Ticker.objects.all().delete()
        for key in data['result']:
            if isinstance(data['result'][key], int):
                continue
            crypto_data =data['result'][key]
            ticker_data = Ticker(crypto = (key),
                                a_0 = (crypto_data.get('a')[0]),
                                a_1 = (crypto_data.get('a')[1]),
                                )

            ticker_data.save()

我的任務.py

from __future__ import absolute_import, unicode_literals
from celery.utils.log import get_task_logger
import sys
from celery import shared_task
from ticker.views import TickerRetrieve
from django.core.management import call_command

a = TickerRetrieve()
    
@shared_task(name="updatemy_ticker")
def updatemy_ticker_task(ticker_data):
    return a.get_object(ticker_data)

Flower 和本地服務器顯示計划任務正常工作,但我無法讓 tasks.py 觸發 views.py 中的 class 方法運行。 我在這里瀏覽了幾個示例並閱讀了文檔,但沒有一個添加類似的示例。

解決方案只是通過在 tasks.py 中返回 function 名稱 a.get_object() 而沒有任何 arguments 自動任務現在像時鍾一樣工作。

任務.py

from __future__ import absolute_import, unicode_literals
from celery.utils.log import get_task_logger
import sys
from celery import shared_task
from ticker.views import TickerRetrieve
from django.core.management import call_command


a = TickerRetrieve()
    
@shared_task(name="updatemy_ticker")
def updatemy_ticker_task():
    return a.get_object()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM