简体   繁体   中英

Set timer for a Django view execution

I'm struggling trying to prevent a Django view from being executed more than once within an hour period. In other words, if the function runs at 15:00, all future requests for all users should be ignored until 17:00 when it's allowed to run once more again.

Tried with a timer, but it does get reset every time the view is called. Maybe someone can point me in the right direction? Thanks!!!

import threading as th

def hello():
    print("hello, world")


def webhook(request):
   
   tm = th.Timer(3600, hello)
    
    if request.method == 'POST' and not tm.is_alive():
        
        tm.start()
        
        code_to.ecexute()

        return HttpResponse("Webhook received!")

Ultimately, this is what I did and it seems to work fine. I actually need it to run no more than once a day, hence the conditional below.

Thanks for all the suggestions!!!

def webhook2 (request):
    today = datetime.now().date()
    with open('timestamp.txt') as f:
        tstamp = f.read()
        last_run = datetime.strptime(tstamp, '%Y-%m-%d')
        last_run_date = datetime.date(last_run)
        print ("last run: " + str(last_run_date))
        

    if last_run_date < today:

        
        file = open("timestamp.txt" ,"w")
        file.write(str(today))
        file.close()

        if request.method == 'POST':
            msg = str(request.body)
            final_msg=msg[2:-1]
            print("Data received from Webhook is: ", request.body)

            # creates a google calendar event
            function_logic()

            return HttpResponse("Webhook received! Event added to calendar")
    
    
    else:
        print ("we already have a record for today")

        return HttpResponse("Not adding a record. We already have one for today.")

Your timer is being reset everytime because it is inside a function that is execute everytime when request is being made. You should try to set the timer globally, such as outside your function. ( be aware when your script will re-run, timer will be reset again ).

import threading as th

def hello():
    print("hello, world")

tm = None

def webhook(request):
   
    # check here if timer is dead then process the request.
    if timer_is_dead || tm is None:
        
        # accessing global value and setting it for first time
        if tm is None:
            global tm
            tm =  th.Timer(3600, hello)
            tm.start()
        
        if request.method == 'POST' and not tm.is_alive():
     
            code_to.ecexute()

            # start timer again for next hour
            
            return HttpResponse("Webhook received!")
    else:
        return HttResponse("Not Allowed")

Edit: Handling first request and then starting timer

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM