Search code examples
pythondjangobackground-processpythonanywhere

Best practices for often repeating background tasks in django and pythonanywhere


So, I am currently working on a django project hosted at pythonanywhere, which includes a feature for notifications, while also receiving data externally from sensors through AWS. I have been thinking of the best practice in order to implement this.

I currently have a simple implementation which is a view that checks all notifications and does the actions as needed if required, with an always-on task (which simply means a script that is running independently) sending a REST request to the server every minute.

Server side:

views.py:

def checkNotifications(request):
    notificationsObject = notifications.objects.order_by('thing').values_list('thing').distinct()
    thingsList = list(notificationsObject)
    for thing in thingsList:
        valuesDic = returnAllField(thing)
        thingNotifications = notifications.objects.filter(thing=thing)
        #Do stuff for each notification

urls:

path('notifications/',views.checkNotifications,name="checkNotification")

and the client just sents a GET request to my URL/notifications/. which works.

Now, while researching I saw some other options such as the ones discussed here with django background tasks and/or celery:

How to initialize repeating tasks using Django Background Tasks?

Celery task best practices in Django/Python

as well as some other options.

My question is: Is there a benefit to moving from my first implementation to this one? The only benefit I can see directly is avoid abuse from another service trying to hit my URl to check notifications too often, but I can/have a required authentication to avoid that. And, is there a certain "best practice" with regards to this, considering that I am checking with this repeating task quite so often, it almost feels like there should be a more proper/cleaner solution. For one, I am not sure if running a repeating task is the best option with pythonanywhere. (https://help.pythonanywhere.com/pages/AsyncInWebApps/ suggests using always-on tasks, but it also mentions django background tasks)

Thank you


Solution

  • To use Django background tasks on PythonAnywhere you need to run it using an always-on task, so it is not an alternative, but just the other use of always-on tasks.

    You can also access your Django code in your always-on task directly with some kind of long-running management command, so you do not need to hit your web app with a special request.