芹菜任务工作者刷新

时间:2020-02-26 17:42:50

标签: python django heroku celery

我有一个非常基本的任务配置。但是,我的问题是我有一个每小时都会更新的变量。此变量是API的auth_token。如果auth_token过期,则任务错误,因为它无法连接到API。如果我尝试在刷新auth_token之后立即处理记录,则该任务会出错,说明我的auth_token已过期。但是,如果我重新启动工作程序,则该任务将使用新的auth_token按照设计进行工作。我一直在搜索Celery文档,寻找可以添加到我的任务中的配置,这些配置将在处理refresh_access_token任务后强制其清除缓存,但找不到任何内容。

任何帮助将不胜感激!

serializer.py

# List Create View
class LedgerAPIView(generics.ListCreateAPIView):
    queryset = Ledger.objects.all()
    serializer_class = LedgerSerializer
    permission_classes = [IsAdminUser]
    authentication_classes = [TokenAuthentication, SessionAuthentication]
    pagination_class = PageNumberPagination

    def perform_create(self, serializer):
        """
        Posting to the API requires that a user have an auth_token and be classified
        as an active_user.
        """
        serializer.save()
        # Create ProcessRecord Object 
        ledger_object = Ledger.objects.get(id=serializer.instance.id)
        record = ProcessedRecords(payment_allocation_name=ledger_object)
        try:
            record.save()
        except Exception as exc:
            formatted = "Cannot update ProcessedRecords Table! ERROR --> {}".format(
                repr(exc))
            raise Exception(formatted)

        # Start Celery Tasker
        process_data = retrieve_sf_data.delay(serializer.instance.payment_allocation_name, serializer.instance.id)

tasks.py

@task(name='retrieve_sf_data')
def retrieve_sf_data(name, id):
    ledger_object = Ledger.objects.get(id=id)
    db_log = ProcessedRecords.objects.get(payment_allocation_name=ledger_object)

    # Set status to WIP
    if db_log: 
        ProcessedRecords.objects.filter(id=db_log.id).update(process_status='WIP')

    # Begin ETL Pipeline
    status, data = run_sf_pipeline(name)

    # Update log to reflect outcome
    if status == True: 
        if db_log: 
            ProcessedRecords.objects.filter(id=db_log.id).update(sf_data_processed=now)
            ProcessedRecords.objects.filter(id=db_log.id).update(process_status='Complete')
            ProcessedRecords.objects.filter(id=db_log.id).update(process_ended=now)
    else: 
        if db_log: 
            ProcessedRecords.objects.filter(id=db_log.id).update(sf_data_processed=now)
            ProcessedRecords.objects.filter(id=db_log.id).update(process_status='Data Not Processed --> ERROR!')
            # Remove record from database so it can be processed again. The log record will be preserved. 
            clean_mess.delay(id)


# Task that updates value every hour

@task(name="refresh_access_token")
def refresh_access_token():
    """ Task to refresh the access_token provided for SkyApi interactions """
    client = SkyApi(request_type='SKY_API_OAUTH_ENDPOINT')
    response = client.access_token.get_refresh_token(SUBSCRIPTION_KEY, REFRESH_TOKEN, REDIRECT_URI, APPLICATION_ID, APPLICATION_SECRET)

    try: 
      User.objects.filter(nickname='worker-user').update(sky_api_access_token=response.get('access_token')) 
    except: 
        pass

0 个答案:

没有答案