You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			HTML
		
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			HTML
		
	
<!DOCTYPE html>
 | 
						|
<html lang="en">
 | 
						|
<head>
 | 
						|
  <meta charset="UTF-8">
 | 
						|
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
						|
  <title>Celery example</title>
 | 
						|
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/css/bootstrap.min.css"
 | 
						|
        integrity="sha512-XWTTruHZEYJsxV3W/lSXG1n3Q39YIWOstqvmFsdNEEQfHoZ6vm6E9GK2OrF6DSJSpIbRbi+Nn0WDPID9O7xB2Q=="
 | 
						|
        crossorigin="anonymous" referrerpolicy="no-referrer"/>
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
  <div class="container">
 | 
						|
    <div class="row">
 | 
						|
      <div class="col-12 col-md-4">
 | 
						|
        <form id="your-form">
 | 
						|
          <div class="mb-3">
 | 
						|
            <label for="email" class="form-label">Email address</label>
 | 
						|
            <input type="email" class="form-control" id="email" name="email">
 | 
						|
          </div>
 | 
						|
          <div class="mb-3">
 | 
						|
            <label for="username" class="form-label">Username</label>
 | 
						|
            <input type="text" class="form-control" id="username" name="username">
 | 
						|
          </div>
 | 
						|
          <div class="mb-3" id="messages"></div>
 | 
						|
          <button type="submit" class="btn btn-primary">Submit</button>
 | 
						|
        </form>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
 | 
						|
  <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/js/bootstrap.min.js"
 | 
						|
          integrity="sha512-8Y8eGK92dzouwpROIppwr+0kPauu0qqtnzZZNEF8Pat5tuRNJxJXCkbQfJ0HlUG3y1HB3z18CSKmUo7i2zcPpg=="
 | 
						|
          crossorigin="anonymous" referrerpolicy="no-referrer"></script>
 | 
						|
  <script>
 | 
						|
    function updateProgress(yourForm, task_id, btnHtml) {
 | 
						|
      const ws_url = `/ws/task_status/${task_id}`;
 | 
						|
      const WS = new WebSocket((location.protocol === 'https:' ? 'wss' : 'ws') + '://' + window.location.host + ws_url);
 | 
						|
 | 
						|
      WS.onmessage = function (event) {
 | 
						|
        const res = JSON.parse(event.data);
 | 
						|
        const taskStatus = res.state;
 | 
						|
 | 
						|
        if (['SUCCESS', 'FAILURE'].includes(taskStatus)) {
 | 
						|
          const msg = yourForm.querySelector('#messages');
 | 
						|
          const submitBtn = yourForm.querySelector('button[type="submit"]');
 | 
						|
 | 
						|
          if (taskStatus === 'SUCCESS') {
 | 
						|
            msg.innerHTML = 'job succeeded';
 | 
						|
          } else if (taskStatus === 'FAILURE') {
 | 
						|
            msg.innerHTML = res.error;
 | 
						|
          }
 | 
						|
 | 
						|
          submitBtn.disabled = false;
 | 
						|
          submitBtn.innerHTML = btnHtml;
 | 
						|
 | 
						|
          // close the websocket because we do not need it now
 | 
						|
          WS.close();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    function serialize (data) {
 | 
						|
      let obj = {};
 | 
						|
      for (let [key, value] of data) {
 | 
						|
        if (obj[key] !== undefined) {
 | 
						|
          if (!Array.isArray(obj[key])) {
 | 
						|
            obj[key] = [obj[key]];
 | 
						|
          }
 | 
						|
          obj[key].push(value);
 | 
						|
        } else {
 | 
						|
          obj[key] = value;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return obj;
 | 
						|
    }
 | 
						|
 | 
						|
    document.addEventListener("DOMContentLoaded", function () {
 | 
						|
      const yourForm = document.getElementById("your-form");
 | 
						|
      yourForm.addEventListener("submit", function (event) {
 | 
						|
        event.preventDefault();
 | 
						|
        const submitBtn = yourForm.querySelector('button[type="submit"]');
 | 
						|
        const btnHtml = submitBtn.innerHTML;
 | 
						|
        const spinnerHtml = 'Processing...';
 | 
						|
        submitBtn.disabled = true;
 | 
						|
        submitBtn.innerHTML = spinnerHtml;
 | 
						|
 | 
						|
        const msg = yourForm.querySelector('#messages');
 | 
						|
        msg.innerHTML = '';
 | 
						|
 | 
						|
        // Get all field data from the form
 | 
						|
        let data = new FormData(yourForm);
 | 
						|
        // Convert to an object
 | 
						|
        let formData = serialize(data);
 | 
						|
 | 
						|
        fetch('/users/form/', {
 | 
						|
          method: 'POST',
 | 
						|
          headers: {
 | 
						|
            'Content-Type': 'application/json'
 | 
						|
          },
 | 
						|
          body: JSON.stringify(formData),
 | 
						|
        })
 | 
						|
        .then(response => response.json())
 | 
						|
        .then((res) => {
 | 
						|
          // after we get Celery task id, we start polling
 | 
						|
          const task_id = res.task_id;
 | 
						|
          updateProgress(yourForm, task_id, btnHtml);
 | 
						|
          console.log(res);
 | 
						|
        }).catch((error) => {
 | 
						|
          console.error('Error:', error);
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
  </script>
 | 
						|
</body>
 | 
						|
</html>
 |