python - Flask:RuntimeError:在请求上下文之外工作
问题描述
我正在尝试用 ROS 和烧瓶控制机器人。问题是当我用 ctrl-c (SIGINT) 杀死 ROS 时,烧瓶会减慢这个过程,因为它没有立即关闭。我已经实现了一个 signal_handler 来处理 ctrl-c 并关闭烧瓶。
问题是当我运行它并按下
ctrl-c i 立即关闭所有内容,但出现以下错误:
RuntimeError:在请求上下文之外工作。
我该如何解决这个错误?
#!/usr/bin/env python
import rospy
from raspimouse_ros.msg import MotorFreqs
from time import sleep
from flask import Flask, request
from os.path import join, dirname
from signal import signal, SIGINT
cwd = dirname(__file__)
open(join(cwd, "file.html"))
app = Flask(__name__)
deltaX = 0
deltaY = 0
pub = rospy.Publisher('/motor_raw', MotorFreqs, queue_size=10)
rospy.init_node('control')
msg = MotorFreqs()
def signal_handler(signal_received, frame):
msg.left = 0
msg.right = 0
pub.publish(msg)
print("Quitting .......")
func = request.environ.get('werkzeug.server.shutdown')
func()
signal(SIGINT,signal_handler)
@app.route("/")
def main():
with open(join(cwd, "file.html"), 'r') as f:
program = f.read()
return program
@app.route("/SetSpeed")
def SetSpeed():
global deltaX
global deltaY
deltaX = int(float(request.args.get('x')) * 4)
deltaY = int(float(request.args.get('y')) * 10)
publisher()
return ""
def publisher():
msg.left = int(-deltaY+deltaX)
msg.right = int(-deltaY-deltaX)
rospy.loginfo(msg)
pub.publish(msg)
app.run(host="0.0.0.0")
[control-1] killing on exit
Quitting .......
Traceback (most recent call last):
File "/home/pi/workspace/src/manual_control/scripts/control.py", line 54, in <module>
app.run(host="0.0.0.0")
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 841, in run
run_simple(host, port, self, **options)
File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 708, in run_simple
inner()
File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 673, in inner
srv.serve_forever()
File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 511, in serve_forever
HTTPServer.serve_forever(self)
File "/usr/lib/python2.7/SocketServer.py", line 231, in serve_forever
poll_interval)
File "/usr/lib/python2.7/SocketServer.py", line 150, in _eintr_retry
return func(*args)
File "/home/pi/workspace/src/manual_control/scripts/control.py", line 28, in signal_handler
func = request.environ.get('werkzeug.server.shutdown')
File "/usr/lib/python2.7/dist-packages/werkzeug/local.py", line 343, in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/lib/python2.7/dist-packages/werkzeug/local.py", line 302, in _get_current_object
return self.__local()
File "/usr/lib/python2.7/dist-packages/flask/globals.py", line 37, in _lookup_req_object
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.
This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.
shutting down processing monitor...
... shutting down processing monitor complete
done
解决方案
请求上下文在请求到达时处于活动状态,并在完成后被销毁,因此它在signal_handler
函数中不可用,但是您可以访问app_context
.
推荐阅读
- elasticsearch - Elasticsearch - 从 OLD_INDEX 到 NEW_INDEX 的点别名
- python - Python 中的 format() 实际上是做什么的?
- scala - 重用在模式/匹配/替换/拆分 Spark 函数上使用的字符串
- c - 来自指针的填充结构是否会使对该结构的访问在释放后未定义?
- java - 在一系列字符中第一次出现字符后从字符串中检索子字符串
- flutter - Flutter:创建一个滚动视图,在允许列表滚动之前收缩中心项目
- azure-data-explorer - 如果异步运行,是否保证 Kusto 查询摄取 (.set-or-append)
- javascript - 当 div 显示在上一个 HTML 页面上时,它如何在下一个 HTML 页面上保持显示显示?
- c# - c# wpf用颜色选择器改变字体颜色
- python - 使用 Pymunk 在 Box 上的权重