我有一个非常基本的任务配置。但是,我的问题是我有一个每小时都会更新的变量。此变量是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