Skip to content

Flask - Sijax

Flask – Handling AJAX Requests with JavaScript

Section titled “Flask – Handling AJAX Requests with JavaScript”

Modern web applications often need to update parts of a page without requiring a full page reload. This is typically achieved using Asynchronous JavaScript and XML (AJAX) techniques, although JSON has largely replaced XML as the data format.

Instead of specialized libraries like the older Sijax, the standard approach today involves using the browser’s built-in fetch API (or older XMLHttpRequest) in your client-side JavaScript to send requests to dedicated Flask endpoints. These endpoints then process the request and usually return data in JSON format.

  1. Client-Side (JavaScript): Use the fetch API to send an HTTP request (e.g., GET or POST) to a specific URL endpoint on your Flask server. You can send data along with POST requests.
  2. Server-Side (Flask): Define a route (@app.route) for that URL endpoint. This view function receives the request, performs some action (like querying a database or performing a calculation), prepares the data to be sent back, and returns it as a JSON response using Flask’s jsonify function.
  3. Client-Side (JavaScript): The fetch API receives the JSON response. Your JavaScript code then processes this data and updates the HTML Document Object Model (DOM) to reflect the changes on the web page dynamically.

Let’s create an example where clicking a button fetches some data from the server and displays it on the page.

import time
from flask import Flask, render_template, jsonify
app = Flask(__name__)
# Route for the main page
@app.route('/')
def index():
return render_template('ajax_example.html')
# API endpoint to provide data
@app.route('/get_data')
def get_data():
# Simulate fetching data (e.g., from a database)
current_time = time.strftime("%H:%M:%S")
data = {
'message': 'Data loaded successfully!',
'timestamp': current_time
}
# Return data as a JSON response
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)

HTML Template (templates/ajax_example.html):

Section titled “HTML Template (templates/ajax_example.html):”
<!DOCTYPE html>
<html>
<head>
<title>Flask AJAX Example</title>
</head>
<body>
<h1>Dynamic Data with Flask and JavaScript</h1>
<button id="loadDataBtn">Load Data</button>
<div id="dataContainer" style="margin-top: 20px; border: 1px solid #ccc; padding: 10px;">
Click the button to load data here...
</div>
<script>
const loadDataBtn = document.getElementById('loadDataBtn');
const dataContainer = document.getElementById('dataContainer');
loadDataBtn.addEventListener('click', () => {
dataContainer.textContent = 'Loading...'; // Provide feedback
// Use fetch to call the Flask endpoint
fetch('/get_data') // Sends a GET request
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json(); // Parse the JSON response
})
.then(data => {
// Update the DOM with the received data
dataContainer.innerHTML = `
<p>**Message:** ${data.message}</p>
<p>**Server Time:** ${data.timestamp}</p>
`;
})
.catch(error => {
// Handle potential errors (network, parsing, etc.)
dataContainer.textContent = `Error loading data: ${error}`;
console.error('Fetch error:', error);
});
});
</script>
</body>
</html>
  • The HTML page includes a button and a div to display data.
  • The JavaScript code adds an event listener to the button.
  • When clicked, fetch('/get_data') sends a request to the /get_data route in Flask.
  • The Flask get_data() function prepares a Python dictionary and uses jsonify to convert it into a proper JSON HTTP response.
  • The JavaScript .then(response => response.json()) parses the incoming JSON.
  • The final .then(data => { ... }) uses the parsed data object to update the content of the dataContainer div.
  • Error handling is included using .catch().

This pattern is fundamental for building interactive web applications, including Single Page Applications (SPAs), where the frontend (JavaScript) heavily relies on backend APIs (Flask) to fetch and manipulate data.