Django Threading

Django Threading

    ›Usage

    Usage

    • How to use ?

    Usage

    This document intend to explain usage of threads in django .

    Creating a model

    Create a Task model. We will save thread status in this model

    class Task(models.Model):
        status = models.TextField(null=True, blank=True)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.status
    
        def set_status(self, status=None):
            print(status)  # or use logger
            self.status = status
            self.save()
    
        def get_status(self):
            return self.status
    
    

    Defining task starting view

    # url /start/
    
    def start(request):
        """Start long running task"""
    
        task = Task.objects.create()
        t = threading.Thread(target=lambda: long_running_task(task.id))
        t.setDaemon(True)
        t.start()
        return JsonResponse({'message': 'Task started', 'taskId': task.id})
    

    Defining long running task

    def long_running_task(task_id):
        """A long running task"""
    
        from time import sleep
    
        task = Task.objects.get(pk=task_id)
        task.set_status('1.STEP')
        sleep(1)
        task.set_status('2.STEP')
        sleep(2)
        task.set_status('3.STEP')
        sleep(3)
        task.set_status('4.STEP')
        sleep(4)
        task.set_status('5.STEP')
        sleep(5)
        task.set_status('FINISHED')
    
    

    Defining task status view

    # url /status/<int:task-id>/
    
    def status(request, task_id):
        """Check long running task status"""
    
        task = Task.objects.get(pk=task_id)
        message = task.get_status()
        return JsonResponse({'message': message, 'taskId': task_id})
    

    Invoking the api from ui

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Django with Threading</title>
    </head>
    <body>
    <div class="main">
      <button class="start" onclick="onStart()">Start</button>
      <button class="status" onclick="onStatus()">Status</button>
      <p class="result" id="result"></p>
    </div>
    <script>
      let taskId;
    
      function onStart() {
        const url = "/start/";
        fetch(url)
          .then(resp => resp.json())
          .then(data => {
            taskId = data.taskId;
          })
      }
    
      function onStatus() {
        const url = "/status/" + taskId;
        fetch(url)
          .then(resp => resp.json())
          .then(data => {
            let result = document.getElementById('result');
            result.innerHTML = result.innerHTML + '<br>' + data.message;
          })
      }
    </script>
    </body>
    </html>
    
    • Creating a model
    • Defining task starting view
    • Defining long running task
    • Defining task status view
    • Invoking the api from ui
    More
    WebsiteGitHubStar
    Copyright © 2019 @ozcanyarimdunya