Hue REST API для выполнения запроса Impala ⇐ Python

Программы на Python
Anonymous
Hue REST API для выполнения запроса Impala

Сообщение Anonymous »

В настоящее время я работаю над скриптом Python, в котором вызываю Hue REST API из этой официальной документации для выполнения запросов Impala. Раньше я использовал импорт подключения из impala.dbapi для подключения к службам Impala, но из-за недавних изменений безопасности в нашей организации нам больше не разрешено это делать, поэтому я решил позвонить с помощью API.
После преобразования команды CURL в REST API у меня есть код ниже:

Код: Выделить всё

import requests
import time

HUE_BASE_URL = "http://xyzserver.com:8888/notebook/api"
LOGIN_URL = f"http://xyzserver.com:8888/hue/accounts/login/?fromModal=true"
HIVE_DATABASE = "default"

session = requests.Session()

def get_csrf_and_cookies():
# Step 1: Perform a GET request to get the initial csrf token and session cookies
response = session.get(LOGIN_URL)
csrf_token = session.cookies.get('csrftoken')
session_id = session.cookies.get('sessionid')

if csrf_token and session_id:
print(f"CSRF Token: {csrf_token}")
print(f"Session ID: {session_id}")
return csrf_token, session_id
else:
raise Exception("Failed to retrieve CSRF token or session ID.")

def login(csrf_token, session_id, username='demo', password='demo123'):
# Step 2: Perform login POST request with the csrf token and session ID
login_data = {
'username': username,
'password': password
}
headers = {
'X-CSRFToken': csrf_token
}
cookies = {
'csrftoken': csrf_token,
'sessionid': session_id
}

response = session.post(LOGIN_URL, data=login_data, headers=headers, cookies=cookies)

if response.status_code == 200:
print("Login successful.")
return session.cookies.get('csrftoken'), session.cookies.get('sessionid')  # Get fresh csrf and session cookies
else:
raise Exception(f"Login failed with status code {response.status_code}.")

def create_notebook(csrf_token, session_id):
url = f"{HUE_BASE_URL}/create_notebook"
data = {
"type": "impala",
"directory_uuid": ""
}
headers = {
'X-CSRFToken': csrf_token
}
cookies = {
'csrftoken': csrf_token,
'sessionid': session_id
}

response = session.post(url, json=data, headers=headers, cookies=cookies)
print('in create notebook')
if response.status_code == 200:
try:
notebook_info = response.json()
notebook_id = notebook_info.get('notebook_id')
print(f"Notebook created, notebook_id: {notebook_id}")
return notebook_id
except requests.exceptions.JSONDecodeError:
print("Failed to parse JSON. Raw response:")
print(response.text)
return None
else:
print(f"Error creating notebook.  Status code: {response.status_code}")
return None

def execute_hive_query(query, notebook_id, csrf_token, session_id):
url = f"{HUE_BASE_URL}/execute/impala"
data = {
"executable": f'{{"statement":"{query}","database":"{HIVE_DATABASE}"}}',
"notebook": f'{{"id":"{notebook_id}", "type":"query-impala", "initialType":"impala", "database":"default","isHistory":true,"snippets":[{{"id":null,"statement_raw":"{query}","type":"impala","variables":[]}}],"name":"","isSaved":false,"sessions":[]}}',
"snippet": f'{{"id":1,"type":"impala","result":"","statement":"{query}","properties":{{}}}}'
}

headers = {
'X-CSRFToken': csrf_token
}
cookies = {
'csrftoken': csrf_token,
'sessionid': session_id
}
response = session.post(url, data=data, headers=headers, cookies=cookies)
print('Response in execute query')
print(response)
if response.status_code == 200:
result = response.json()
print(result)
history_id = result.get('history_id')
print(f"Query executed, history_id: {history_id}")
return history_id
else:
print(f"Error executing query: {response.status_code}")
return None
def run_hive_query(query):
# Step 1: Get CSRF token and cookies
csrf_token, session_id = get_csrf_and_cookies()

# Step 2: Login and get fresh tokens and cookies
csrf_token, session_id = login(csrf_token, session_id)

# Step 3: Create a notebook and get its ID
notebook_id = create_notebook(csrf_token, session_id)
if not notebook_id:
return

if __name__ == "__main__":
query = "SHOW TABLES"
run_hive_query(query)
Функция get_csrf_and_cookies и вход в систему работает правильно, и я получаю правильный csrftoken и идентификатор сеанса. Проблема возникает, когда он вызывает create_notebook(), ответ равен 200, но в ответ я получаю HTML-код, и консоль печатает это из кода:

Код: Выделить всё

response = session.post(url, json=data, headers=headers, cookies=cookies)
print('in create notebook')
if response.status_code == 200:
try:
notebook_info = response.json() #This line throws error because i am getting html, DON'T KNOW WHY!!!!!!
и ответ:

Код: Выделить всё






Hue

- Welcome to Hue





...
...
...
// We collect only 2 path levels: not hostname, no IDs, no anchors...
var _pathName = location.pathname;
var _splits = _pathName.substr(1).split("/");
_pathName = _splits[0] + (_splits.length > 1 && $.trim(_splits[1]) != "" ? "/" + _splits[1] : "");

ga('send', 'pageview', {
'page': '/remote/3.9.0-cdh5.16.2/' + (IS_HUE_4 ? '4/' : '3/') + _pathName
});

function trackOnGA(path) {
if (typeof ga != "undefined" && ga != null) {
ga('set', 'referrer', 'http://gethue.com'); // we force the referrer to prevent leaking sensitive information
ga('send', 'pageview', {
'page': '/remote/3.9.0-cdh5.16.2/' + (IS_HUE_4 ? '4/' : '3/') + path
});
}
}





Буду благодарен за любую помощь, позволяющую узнать, почему я не получаю правильный ответ JSON и что я делаю неправильно! Спасибо

Подробнее здесь: https://stackoverflow.com/questions/790 ... pala-query

Вернуться в «Python»