第一次寫(xiě)東西呀,嘻嘻??不斷學(xué)習(xí)不斷反??!
因?yàn)檫@個(gè)問(wèn)題并不清楚是不是Bottlepy的本意,所以只能稱(chēng)之為問(wèn)題而不是bug。
公司需要用網(wǎng)頁(yè)訪問(wèn)串口,網(wǎng)頁(yè)當(dāng)然只能用JS了,但是瀏覽器運(yùn)行的JS是運(yùn)行在沙箱模式下,不能訪問(wèn)串口這么底層的硬件(Node.js這種非瀏覽器運(yùn)行的JS是可以的)。走了許多彎路之后選擇用Bottlepy建立一個(gè)localhost,網(wǎng)頁(yè)再訪問(wèn)localhost即可實(shí)現(xiàn)訪問(wèn)硬件。但是,這樣直接用Ajax訪問(wèn)屬于跨域的,需要CORS相關(guān)支持。于是需要在服務(wù)器上稍微設(shè)置一下。把每次Ajax請(qǐng)求用一個(gè)header包裹一下。
@bottle.hook('after_request')
def enable_cors():
bottle.response.headers['Access-Control-Allow-Origin'] = '*'
但是實(shí)測(cè)仍然是500錯(cuò)誤,Chrome控制臺(tái)一看Ajax并沒(méi)有header(此處應(yīng)有圖)。網(wǎng)上Google了外國(guó)人的資料并沒(méi)有有用的東西,最后還是靠國(guó)人的文章提示才弄明白(原文是互相轉(zhuǎn)載的,我也搞不清原作者是誰(shuí),一并謝過(guò))。Bottlepy的源代碼中有一段初始化header的代碼(下段被注釋掉的代碼)在我們執(zhí)行上述代碼之后,實(shí)際上等于把我們的設(shè)置都變成無(wú)用功了。修改一下,如果已經(jīng)有header了就不要初始化了,問(wèn)題解決。
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上看官方解釋?zhuān)袀€(gè)人提議把@bottle.hook('after_request')改成@bottle.hook('before_request'),我并沒(méi)有試過(guò)這樣行不行。
訪問(wèn)localhost奇慢,而且第一次訪問(wèn)一定要等至少10秒鐘才會(huì)有結(jié)果,在這十秒鐘之內(nèi)的Ajax也是pending到10秒一起返回,之后的任何Ajax都要延時(shí)3到4秒。這倒不是Bottlepy的問(wèn)題,是我使用的系統(tǒng)設(shè)置問(wèn)題。貌似是因?yàn)槟J(rèn)啟用了IPv6但是實(shí)際上又沒(méi)用到IPv6導(dǎo)致的。解析localhost不是::1會(huì)花很長(zhǎng)時(shí)間,直接訪問(wèn)127.0.0.1就沒(méi)事了。
把localhost指定到0.0.0.0即可實(shí)現(xiàn)局域網(wǎng)內(nèi)任何電腦訪問(wèn)192.168.X.X(你的IP)就能訪問(wèn)你建立的localhost了。
bottle.run(host='0.0.0.0', port=8080, debug=True)