第一次寫東西呀,嘻嘻??不斷學習不斷反式趸芒帕!
因為這個問題并不清楚是不是Bottlepy的本意,所以只能稱之為問題而不是bug丰介。
公司需要用網(wǎng)頁訪問串口背蟆,網(wǎng)頁當然只能用JS了,但是瀏覽器運行的JS是運行在沙箱模式下哮幢,不能訪問串口這么底層的硬件(Node.js這種非瀏覽器運行的JS是可以的)带膀。走了許多彎路之后選擇用Bottlepy建立一個localhost,網(wǎng)頁再訪問localhost即可實現(xiàn)訪問硬件橙垢。但是垛叨,這樣直接用Ajax訪問屬于跨域的,需要CORS相關支持柜某。于是需要在服務器上稍微設置一下嗽元。把每次Ajax請求用一個header包裹一下。
@bottle.hook('after_request')
def enable_cors():
bottle.response.headers['Access-Control-Allow-Origin'] = '*'
但是實測仍然是500錯誤喂击,Chrome控制臺一看Ajax并沒有header(此處應有圖)剂癌。網(wǎng)上Google了外國人的資料并沒有有用的東西,最后還是靠國人的文章提示才弄明白(原文是互相轉(zhuǎn)載的翰绊,我也搞不清原作者是誰佩谷,一并謝過)。Bottlepy的源代碼中有一段初始化header的代碼(下段被注釋掉的代碼)在我們執(zhí)行上述代碼之后监嗜,實際上等于把我們的設置都變成無用功了谐檀。修改一下,如果已經(jīng)有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秒鐘才會有結(jié)果五垮,在這十秒鐘之內(nèi)的Ajax也是pending到10秒一起返回乍惊,之后的任何Ajax都要延時3到4秒。這倒不是Bottlepy的問題放仗,是我使用的系統(tǒng)設置問題润绎。貌似是因為默認啟用了IPv6但是實際上又沒用到IPv6導致的。解析localhost不是::1會花很長時間诞挨,直接訪問127.0.0.1就沒事了莉撇。
把localhost指定到0.0.0.0即可實現(xiàn)局域網(wǎng)內(nèi)任何電腦訪問192.168.X.X(你的IP)就能訪問你建立的localhost了。
bottle.run(host='0.0.0.0', port=8080, debug=True)