Я успешно реализовал метод GET API контроллера Unifi в Grafana, используя источник данных Infinity. Однако я столкнулся с трудностями при использовании метода POST.
Вот мой текущий код сервера Python Flask, который обрабатывает вход в систему и извлекает данные с помощью методов GET и POST:
Код: Выделить всё
import requests
from requests.exceptions import SSLError, RequestException
app = Flask(__name__)
# Disable SSL warnings from urllib3
requests.packages.urllib3.disable_warnings()
# Constants for API endpoints and credentials
LOGIN_URL = "https://unifi.website.com/api/login"
DEVICE_STATS_URL = "https://unifi.website.com/api/s/lp0csd81/stat/device"
STA_STATS_URL = "https://unifi.website.com/api/s/lp0csd81/stat/sta"
USERNAME = "username"
PASSWORD = "password"
def perform_login():
login_payload = {
"strict": True,
"password": PASSWORD,
"remember": True,
"username": USERNAME
}
login_headers = {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
}
try:
response = requests.post(LOGIN_URL, headers=login_headers, json=login_payload, verify=False)
response.raise_for_status()
return response.cookies.get_dict() if response.status_code == 200 else None
except (SSLError, RequestException) as err:
print(f"Error occurred: {err}")
return None
@app.route('/fetch_device_stats', methods=['GET'])
def fetch_device_stats():
cookies = perform_login()
if cookies:
csrf_token = cookies.get('csrf_token', '')
unifises = cookies.get('unifises', '')
headers = {
'Accept': 'application/json, text/plain, */*',
'X-Csrf-Token': csrf_token,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'csrf_token={csrf_token}; unifises={unifises}'
}
try:
response = requests.get(DEVICE_STATS_URL, headers=headers, verify=False)
response.raise_for_status()
return jsonify(response.json()) if response.status_code == 200 else f"Failed to fetch device stats. Status code: {response.status_code}"
except RequestException as err:
print(f"Error occurred: {err}")
return f"Request Exception occurred: {err}"
return "Login failed. Unable to fetch device stats."
@app.route('/fetch_sta_stats', methods=['POST'])
def fetch_sta_stats():
cookies = perform_login()
if cookies:
csrf_token = cookies.get('csrf_token', '')
unifises = cookies.get('unifises', '')
headers = {
'Accept': 'application/json, text/plain, */*',
'X-Csrf-Token': csrf_token,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'csrf_token={csrf_token}; unifises={unifises}'
}
try:
response = requests.post(STA_STATS_URL, headers=headers, verify=False)
response.raise_for_status()
return jsonify(response.json()) if response.status_code == 200 else f"Failed to fetch STA stats. Status code: {response.status_code}"
except RequestException as err:
print(f"Error occurred: {err}")
return f"Request Exception occurred: {err}"
return "Login failed. Unable to fetch STA stats."
if __name__ == '__main__':
app.run(debug=True)
Вот как она выглядит
Код: Выделить всё
{
"macs": ["b2:1c:b6:25:76:41"]
}
Код: Выделить всё
0: "b2:1c:b6:25:76:41"

Следует ли мне создать собственную полезную нагрузку в этом формате, чтобы использовать ее в качестве временного ряда, но на основе MAC-адресов? Как мне следует структурировать полезную нагрузку запроса и интегрировать ее с Grafana, используя источник данных Infinity, чтобы добиться этого?
Будем очень признательны за любые рекомендации или примеры!
Дополнительный контекст:
- Я использую Grafana с источником данных Infinity. Метод GET
просто реализовать, но метод POST вызывает проблемы.
Я хочу визуализировать данные на основе MAC-адресов в формате временных рядов
. - Gunicorn в Flask Server
Подробнее здесь: https://stackoverflow.com/questions/786 ... g-infinity