Запуск функции 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, если это возможно.
Спасибо за ваше понимание.