- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 Bottle.py 作为脚本内的进程运行,但我很沮丧,因为它没有按我的预期工作。这是我的脚本的假设/简化表示。我尝试添加尽可能多的评论。
magball.py
import serial
from bottle import route, run, template, request
import multiprocessing
import logging
import datetime
#Here are the most important variables which will be used in the entire script
global lastcommand #The last command received from bottle web interface
global status #What is the current status
lastcommand = 'Go Home' #Options: Start Drawing, Go Home, Next Drawing
status = 'home' #Options: home, homing (means going home), drawing
def log_this(level, msg)
#a special log function based on logging library for debugging
pass # <- details are not important, it is working fine
now = datetime.datetime.now()
timeString = now.strftime("%Y-%m-%d %H:%M")
info = {'title' : 'MAGBALL', 'time': timeString, 'lastcommand': lastcommand, 'status': status} #These are passed to main.tpl
@route('/', method='GET')
@route('/', method='POST')
def index(): #<- This works fine, passing the info to the template file (main.tpl) in views directory
global lastcommand #<- Isn't this referring to the global lastcommand declared at the beginning?
if request.method == 'POST':
lastcommand = request.forms.get("submit") #<- This works fine and lastcommand changes when the button on the web page is clicked
log_this('info', (lastcommand + ' clicked on web interface')) #<- I can see in the logs which button is clicked, so, this should mean
#that lastcommand (supposedly the global one) was changed successfully
return template('main.tpl', info)
p_bottle = multiprocessing.Process(target=run, kwargs=dict(host='0.0.0.0', port=80, debug='True')) #<- I start bottle as a process because I think I have to
p_bottle.daemon = True
def draw_pattern() #<- This function can easily run for hours which is fine/normal for the purpose
#Unless lastcommand is not equal to 'Start Drawing' this should run forever
global status
global lastcommand
status = 'drawing' #<- I think this should also refer to the global lastcommand declared at the beginning
#Opens a random file from a specific directory,
for filename in shuffled_directory:
#reads the file line by line and feeds it to the serial port
.
.
if lastcommand != 'Start Drawing': #<- This never works! Although I see in the logs that lastcommand was changed by index() function
log_this('warning', 'Last command changed during line feeding.')
break
def go_home()
global status
status = 'homing' #<- I think this should also refer to the global lastcommand declared at the beginning
#Send some commands to serial port and after that change the value of status
.
.
status = 'home'
while true: #This is the infinite loop that needs to run forever
global status #Don't these variables also refer to the global variables declared at the beginning?
global lastcommand
p_bottle.start() #The bottle.py web interface runs successfully
#The following while, if etc never runs. I think this "while true:" statement never gets notified
#that the values of lastcommand and/or status has changed
while lastcommand == 'Start Drawing':
if status == 'home':
draw_pattern()
if status == 'homing':
time.sleep(5)
if status == 'drawing':
pass
while lastcommand == 'Next Drawing':
if status == 'home':
draw_pattern()
if status == 'homing':
time.sleep(5)
if status == 'drawing':
go_home()
draw_pattern()
while lastcommand == 'Go Home':
if status == 'home':
pass
if status == 'homing':
pass
if status == 'drawing':
go_home()
main.tpl
<!DOCTYPE html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Magball Web Interface</h1>
<h2>The date and time on the server is: {{ time }}</h2>
<h2>The last command is: {{ lastcommand }}</h2>
<h2>Status: {{ status }}</h2>
<form name='magballaction' method='POST'>
<input type="submit" name="submit" value="Start Drawing">
<input type="submit" name="submit" value="Go Home">
<input type="submit" name="submit" value="Next Drawing">
</form>
</body>
</html>
发生的事情是这样的:
Bottle 进程运行良好(网页可访问),当我单击网页上的按钮时,我在日志中看到 Lastcommand 的值已被 Web 界面更改。
然而,最后的无限循环 (while true:
) 永远不会收到有关 lastcommand 的值已更改的通知。例如,如果 status = home 且 lastcommand 从 Web 界面更改为“Start Drawing”,则它不会执行 draw_pattern()
。它什么也不做。
我尝试将所有内容放入 def index()
函数中 return template('main.tpl', info)
行之前,但随后代码运行,但是Web 界面等待代码完成才能启动。由于 draw_pattern()
持续数小时,return template('main.tpl', info)
行实际上不会运行,并且网页无法访问。
我还尝试将 def index()
作为普通函数运行,但是当我这样做时,唯一运行的是 Web 界面 (def index()
) >).
那么,我该怎么做才能通知 while 循环 Lastcommand 和/或状态的值已更改?
最佳答案
对于任何感兴趣的人,我已经使用线程而不是多处理解决了这个问题。因此,不要使用这个:
p_bottle = multiprocessing.Process(target=run, kwargs=dict(host='0.0.0.0', port=80, debug='True'))
p_bottle.daemon = True
我用过:
p_bottle = threading.Thread(target=run, kwargs=dict(host='0.0.0.0', port=80, debug='True'))
p_bottle.daemon = True
现在线程中的函数可以成功更改全局变量,该全局变量会立即被无限 while true 循环获取。谢谢大家的建议。
关于python - 如何与无限循环同时运行 Bottle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44451364/
我正在开发一个基于 Python 的应用程序(HTTP -- REST 或 jsonrpc 接口(interface)),它将用于生产自动化测试环境。这将连接到运行所有测试脚本的 Java 客户端。即
我正在关注Recipes的bottle框架。 当我尝试下面的代码时 #filename: mywebapp.py from bottle import Bottle, run, request app
我通常使用method version处理 Bottle 中的路由 bottle.route("/charge", "GET", self.charge) bottle 文档严重依赖 @route 装
如何在 Bottle 框架中执行基本身份验证?在 flask 中我曾经: def check( username, password ): # This function is called
是否可以在同一应用程序(同一端口)中托管一个普通 Bottle 应用程序和一个 WebSocket 应用程序(例如: https://github.com/defnull/bottle/blob/ma
我有使用 python 2.7.2、bottle 0.10.9 和“瑞士军刀” scrapy 0.14.1 编写的简单 REST API。 简单来说,只有一种方法 (myserver:8081/dop
嗨,有没有办法优雅地关闭 Bottle 服务器。在某种程度上,它应该能够在最终停止之前执行几个步骤。这对于线程和数据库状态等的一些清理至关重要,以避免重新启动期间的损坏状态。 我正在使用 mod ws
我正在尝试让服务器发送事件在Python中工作,所以我找到了一些演示代码,令我惊讶的是,它只部分工作,我不明白为什么。我从here获取代码并进行了一些小的更改,这样我就可以看到什么在起作用(我包括了一
有没有办法让我的网站可以通过我所连接的网络访问? from bottle import route, run, template @route('/hello/') def index(name):
如果我直接从 Bottle 导入 post、get 和 jinja2_view,我就可以使用 jinja2_view 作为装饰器: from bottle import get, post, requ
我正在尝试将 Bottle.py 作为脚本内的进程运行,但我很沮丧,因为它没有按我的预期工作。这是我的脚本的假设/简化表示。我尝试添加尽可能多的评论。 magball.py import serial
(免责声明:我正在发现 python) 使用以下代码: @route('/test', method='POST') def index_view(): image = request.fil
我有一个 Bottle 服务器在端口 8080 上运行,使用“gevent”服务器。我使用这个服务器来支持一些简单的“服务器发送事件”。 我的问题可能与不知道我的设置是如何工作有关。我希望有人能花时间
我最近接触了 Bottlepy,这几乎是我第一次使用模板引擎。(之前我会简单地用传统 PHP 制作我需要的东西) 我的问题是这样的,假设我有一个基本布局(一个简单的 HTML/CSS 布局),并且,例
我如何管理 Bottle 中的多个应用程序,一次运行? 应用 0 from bottle import Bottle app0 = Bottle() @app0.route('/app0/') def
我将 bottle 用于一个显示日历并允许用户指定年份和月份的简单应用。定义了以下路由: '/' # 当前年份和当前月份 '/year' #年和当月 '/year/month' #年月 但是,无法识别
我正在使用 Bottle 框架。我已经设置了 @error 装饰器,所以我能够显示我自定义的错误页面,如果发生任何 500 错误我也可以发送电子邮件,但我需要在电子邮件中发送完整的回溯。有谁知道如何将
我有这样的目录结构: . ├── controller │ ├── FooController.py │ ├── __init__.py │ ├── main.py FooController
我在 bottle 中使用 html,在“index.html”中我导入外部 JS 和 CSS。 但是加载页面时,找不到css和js。 我的项目结构: testBottle.py 中的代码: impo
嗨,我是 python 和 bottle 的新手 我有一个网站 这是结构 |root index.py |classes session.py 如何从 index.py 访问
我是一名优秀的程序员,十分优秀!