Запуск функции Python из веб-страницы CherryPy с помощью django

Мой проект - это проект модели клиент/сервер с использованием Python, CherryPy и Django.

Программа на Python имеет различные функции, подобные серверу (добавление/удаление/редактирование материалов из/в базу данных, выполнение команд и т.д.).

Это база данных SQLite, поэтому я бы хотел, чтобы сервер был единственным ответственным за запись в базу данных, а клиентское WebApp было бы просто порталом к тому, что есть в базе данных в отношении значений и указывало серверу, что делать.

При запуске программы python одной из ее задач является инициализация сервера CherryPy, на котором размещен веб-сайт Django, являющийся своего рода графическим интерфейсом для серверного приложения.

Я использую следующий поток для запуска веб-сервера CherryPy:

class ClientThread(object):
  HOST = get_setting_val('BindIP') # Function to read "BindIP" from an ini file.
  PORT = int(get_setting_val('Port')) # Function to read setting from ini file
  DIR = get_setting_val('InstallDir') # function to read setting from ini file.
  STATIC_ROOT = DIR + '/static/'

  def mount_static(self, url, root):
    """
    :param url: Relative url
    :param root: Path to static files root
    """
    config = {
        'tools.staticdir.on': True,
        'tools.staticdir.dir': root,
        'tools.expires.on': True,
        'tools.expires.secs': 86400
    }
    cherrypy.tree.mount(None, url, {'/': config})

  def run(self):
    cherrypy.config.update({
        'server.socket_host': self.HOST,
        'server.socket_port': self.PORT,
        'engine.autoreload_on': False,
        'log.screen': True,
    })
    self.mount_static(settings.STATIC_URL, self.STATIC_ROOT)

    cherrypy.tree.graft(WSGIHandler())
    cherrypy.engine.start()
    print("[Info]: Client started. Use http://{0}:{1} to access the WebApp.".format(self.HOST,self.PORT))
    cherrypy.engine.block()

  def init(self):
    print("[Info]: Starting Client WebApp...")
    cThread = Thread(target=self.run)
    cThread.start()

  def stop(self):
    pass # Pass for now, shutdown server later

Мне нужно, чтобы если пользователь, например, нажимает кнопку на веб-странице Django, размещенной на веб-сервере CherryPy, она возвращалась к функции основного приложения python.

Например, мое приложение django имеет шаблон, который включает кнопку для "doSomething" с определенным ID в базе данных (изменить значение, например):

<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
    <a class="dropdown-item" href="{{ id }}/doSomething">doSomething</a>
</div>

Этот шаблон ведет обратно к представлению:

def doSomething(request, id):
  # Run the function "doSomething" passing value 'id' to the function in main.py

Затем он будет отображен на функцию или даже потенциально на метод класса в основном приложении python:

def doSomething(id):
  cur=sqlConn.cursor()
  q = "INSERT INTO table(foo) VALUES(?)"
  try:
    cur.execute(q, id)
    sqlConn.commit()
  except Exception as err:
    print('[Error] Query doSomething Failed: %s\nError: %s' % (q, str(err)))

Возможно ли то, к чему я стремлюсь, при выбранной мною конфигурации? Доступ к графическому интерфейсу через веб-браузер имеет первостепенное значение. Даже если мне придется перейти с Python на C или что-то еще, это возможно, но я хотел бы придерживаться Python, если это возможно.

Спасибо за ваше понимание.

Вернуться на верх