Of course! Using Python with Django to interact with Zabbix is a very powerful combination. It allows you to build custom dashboards, automate Zabbix tasks, integrate Zabbix data into your own applications, and much more.

Here’s a comprehensive guide covering the main approaches, from simple scripts to full-fledged Django apps.
Understanding the Communication Methods
There are two primary ways a Python script can talk to a Zabbix server:
- Zabbix API (Recommended): This is the best and most robust method. The Zabbix API is a JSON-RPC based web interface that allows you to programmatically interact with almost every aspect of Zabbix (hosts, items, triggers, maps, etc.). It's the standard way to integrate with external systems.
- Direct Database Access (Use with Caution): You can connect directly to the Zabbix database (usually PostgreSQL or MySQL) using Python's database libraries (like
psycopg2ormysql-connector-python). This is generally discouraged because:- It's not officially supported. Zabbix can change its database schema in any release, breaking your code.
- You bypass Zabbix's internal logic and caching, potentially causing performance issues or data inconsistencies.
- It can be complex to handle authentication, permissions, and history data correctly.
For this guide, we will focus exclusively on the Zabbix API, as it's the correct and professional way to do this.
Prerequisites
- Python 3.6+
- Django installed (
pip install django) - A Zabbix Server or Zabbix Frontend running and accessible from your machine.
- A Zabbix user with API access. This user needs the appropriate permissions (e.g., "Zabbix administrator" role for full access, or you can create a custom role with specific permissions).
Method 1: Simple Python Script to Query Zabbix API
Before integrating with Django, let's write a simple script to understand how the Zabbix API works. We'll use the popular requests library to make HTTP calls.

Step 1: Install requests
pip install requests
Step 2: Create a Python script (zabbix_api_example.py)
This script will:
- Define the Zabbix API URL and credentials.
- Construct a JSON-RPC request to log in and get an authentication token.
- Use the token to get a list of all hosts.
- Log out to clean up the session.
import requests
import json
# --- Zabbix API Configuration ---
ZABBIX_URL = "http://your-zabbix-server/zabbix/api_jsonrpc.php"
ZABBIX_USER = "Admin"
ZABBIX_PASSWORD = "zabbix"
# --- Helper Functions ---
def zabbix_api_request(method, params):
"""
Makes a request to the Zabbix API.
"""
headers = {'Content-Type': 'application/json-rpc'}
payload = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": 1,
"auth": None # Will be set after login
}
try:
response = requests.post(ZABBIX_URL, headers=headers, data=json.dumps(payload))
response.raise_for_status() # Raise an exception for bad status codes
return response.json()
except requests.exceptions.RequestException as e:
print(f"Error connecting to Zabbix API: {e}")
return None
def get_zabbix_auth_token():
"""
Authenticates with Zabbix and returns an auth token.
"""
params = {
"user": ZABBIX_USER,
"password": ZABBIX_PASSWORD
}
auth_response = zabbix_api_request("user.login", params)
if auth_response and 'result' in auth_response:
print("Successfully authenticated.")
return auth_response['result']
else:
print("Authentication failed.")
print(f"Response: {auth_response}")
return None
def get_all_hosts(auth_token):
"""
Fetches a list of all hosts from Zabbix.
"""
params = {}
hosts_response = zabbix_api_request("host.get", params, auth_token)
if hosts_response and 'result' in hosts_response:
print("\n--- Zabbix Hosts ---")
for host in hosts_response['result']:
print(f"Host ID: {host['hostid']}, Name: {host['name']}")
return hosts_response['result']
else:
print("Failed to get hosts.")
return None
def logout_zabbix(auth_token):
"""
Logs out from the Zabbix API.
"""
zabbix_api_request("user.logout", {}, auth_token)
print("\nLogged out successfully.")
# --- Main Execution ---
if __name__ == "__main__":
auth_token = get_zabbix_auth_token()
if auth_token:
get_all_hosts(auth_token)
logout_zabbix(auth_token)
How to run:

python zabbix_api_example.py
Method 2: Integrating with a Django App
Now, let's build a proper Django app that uses this logic. This approach is reusable, scalable, and fits into a larger project.
Step 1: Create a Django Project and App
django-admin startproject zabbix_integration cd zabbix_integration python manage.py startapp zabbix_dashboard
Step 2: Configure settings.py
Add your new app to INSTALLED_APPS and configure the Zabbix settings.
# zabbix_integration/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'zabbix_dashboard', # Add your new app
]
# Add Zabbix configuration
ZABBIX_CONFIG = {
'URL': 'http://your-zabbix-server/zabbix/api_jsonrpc.php',
'USER': 'Admin',
'PASSWORD': 'zabbix',
}
Step 3: Create a Zabbix API Service It's good practice to encapsulate the API logic in a dedicated service module.
Create a new file: zabbix_dashboard/services/zabbix_service.py
# zabbix_dashboard/services/zabbix_service.py
import requests
import json
class ZabbixAPIClient:
def __init__(self, url, user, password):
self.url = url
self.user = user
self.password = password
self.auth_token = None
def _make_request(self, method, params):
headers = {'Content-Type': 'application/json-rpc'}
payload = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": 1,
"auth": self.auth_token,
}
try:
response = requests.post(self.url, headers=headers, data=json.dumps(payload))
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"API Error: {e}")
return None
def login(self):
params = {"user": self.user, "password": self.password}
response = self._make_request("user.login", params)
if response and 'result' in response:
self.auth_token = response['result']
return True
return False
def get_hosts(self):
if not self.auth_token:
if not self.login():
return []
params = {"output": ["hostid", "name", "status"]}
response = self._make_request("host.get", params)
if response and 'result' in response:
return response['result']
return []
def logout(self):
if self.auth_token:
self._make_request("user.logout", {})
self.auth_token = None
Step 4: Create a Django View
The view will use our ZabbixAPIClient to fetch data and pass it to a template.
In zabbix_dashboard/views.py:
# zabbix_dashboard/views.py
from django.shortcuts import render
from django.conf import settings
from .services.zabbix_service import ZabbixAPIClient
def host_list_view(request):
"""
Fetches hosts from Zabbix and displays them in a template.
"""
# Initialize the client with settings from settings.py
zabbix_client = ZabbixAPIClient(
url=settings.ZABBIX_CONFIG['URL'],
user=settings.ZABBIX_CONFIG['USER'],
password=settings.ZABBIX_CONFIG['PASSWORD']
)
hosts = []
try:
# Login and get hosts
if zabbix_client.login():
hosts = zabbix_client.get_hosts()
zabbix_client.logout() # Important: Logout to free the session
except Exception as e:
# Handle potential errors gracefully
print(f"An error occurred: {e}")
context = {
'hosts': hosts
}
return render(request, 'zabbix_dashboard/host_list.html', context)
Step 5: Create a Template
Create the template directory and file: zabbix_dashboard/templates/zabbix_dashboard/host_list.html
<!-- zabbix_dashboard/templates/zabbix_dashboard/host_list.html --> <!DOCTYPE html
