第一次写东西呀,嘻嘻☺️不断学习不断反省!
因为这个问题并不清楚是不是Bottlepy的本意,所以只能称之为问题而不是bug。
公司需要用网页访问串口,网页当然只能用JS了,但是浏览器运行的JS是运行在沙箱模式下,不能访问串口这么底层的硬件(Node.js这种非浏览器运行的JS是可以的)。走了许多弯路之后选择用Bottlepy建立一个localhost,网页再访问localhost即可实现访问硬件。但是,这样直接用Ajax访问属于跨域的,需要CORS相关支持。于是需要在服务器上稍微设置一下。把每次Ajax请求用一个header包裹一下。
@bottle.hook('after_request')
def enable_cors():
bottle.response.headers['Access-Control-Allow-Origin'] = '*'
但是实测仍然是500错误,Chrome控制台一看Ajax并没有header(此处应有图)。网上Google了外国人的资料并没有有用的东西,最后还是靠国人的文章提示才弄明白(原文是互相转载的,我也搞不清原作者是谁,一并谢过)。Bottlepy的源代码中有一段初始化header的代码(下段被注释掉的代码)在我们执行上述代码之后,实际上等于把我们的设置都变成无用功了。修改一下,如果已经有header了就不要初始化了,问题解决。
class HTTPResponse(Response, BottleException):
def __init__(self, body='', status=None, headers=None, **more_headers):
super(HTTPResponse, self).__init__(body, status, headers, **more_headers)
def apply(self, response):
response._status_code = self._status_code
response._status_line = self._status_line
# response._headers = self._headers
if self._headers:
if response._headers:
response._headers.update(self._headers)
else:
response._headers = self._headers
response._cookies = self._cookies
response.body = self.body
在GitHub上看官方解释,有个人提议把@bottle.hook('after_request')改成@bottle.hook('before_request'),我并没有试过这样行不行。
访问localhost奇慢,而且第一次访问一定要等至少10秒钟才会有结果,在这十秒钟之内的Ajax也是pending到10秒一起返回,之后的任何Ajax都要延时3到4秒。这倒不是Bottlepy的问题,是我使用的系统设置问题。貌似是因为默认启用了IPv6但是实际上又没用到IPv6导致的。解析localhost不是::1会花很长时间,直接访问127.0.0.1就没事了。
把localhost指定到0.0.0.0即可实现局域网内任何电脑访问192.168.X.X(你的IP)就能访问你建立的localhost了。
bottle.run(host='0.0.0.0', port=8080, debug=True)