Com_error при попытке получить COM-объект с помощью win32com.client из представления Django

Я пытаюсь подключить сессию SAP GUI к моему проекту Django, чтобы я мог взаимодействовать с ним, используя win32com.client для работы с COM объектами. При работе из оболочки у меня нет никаких проблем с тем, чтобы заставить это работать, выполнив следующий код:

sap_gui = win32com.client.GetObject("SAPGUI")
application = sap_gui.GetScriptingEngine
connection = application.Children(0)
session = connection.Children(0)

Если я запускаю сервер с помощью этого кода в модуле Django views.py, это также работает, и я могу получить информацию о сессии, отображаемую в моем представлении Django. Однако я хочу иметь возможность подключать и отключать такую сессию вручную, поскольку разным пользователям нужно будет подключаться к разным сессиям, а запустив код при старте, я смогу подключиться только к первой сессии.

Я пытался заставить это работать, определив следующее представление в файле views.py:

def dashboard(request):
  if request.method == 'POST' and 'SAP_button' in request.POST:
    # Get the COM object (SAP session in this case)
    sap_gui = win32com.client.GetObject("SAPGUI") # ERROR HERE
    application = sap_gui.GetScriptingEngine
    connection = application.Children(0)
    session = connection.Children(0)
    # This is just a test to see if I get the desired output from the COM object
    test = session.info.User
  return render(request, 'Users/dashboard.html', {'test': test})

Соответствующий html-код для формы ('Users/dashboard.html') выглядит следующим образом:

<form action="", method="POST">{% csrf_token %}
    <button type="submit", name="SAP_button">Connect SAP</button>
</form>

При нажатии на кнопку запрос работает как ожидалось, но я получаю следующее com_error: (-2147221020, 'Invalid syntax', None, None). Эта ошибка возникает с самой первой строки при попытке получить объект SAP COM: sap_gui = win32com.client.GetObject("SAPGUI").

Похоже, что код, запускаемый из представления, не может получить доступ к COM-объекту, но я довольно новичок в Django и даже исследуя подобную ошибку, я не смог понять, почему это происходит или возможное решение/обходной путь. Любая помощь будет принята с благодарностью.

После дополнительных исследований я выяснил, что код после POST-запроса из представления Django выполняется в другом потоке, и поэтому COM-библиотеки должны быть инициализированы для такого потока. Я решил эту проблему, добавив следующую строку кода перед получением COM-объекта:

import pythoncom
...
pythoncom.CoInitialize()
sap_gui = win32com.client.GetObject("SAPGUI") # ERROR SOLVED
...
Вернуться на верх