美文网首页
Bottlepy的一点小问题

Bottlepy的一点小问题

作者: 复制完美 | 来源:发表于2017-06-23 05:39 被阅读0次

    第一次写东西呀,嘻嘻☺️不断学习不断反省!


    因为这个问题并不清楚是不是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)
    

    相关文章

      网友评论

          本文标题:Bottlepy的一点小问题

          本文链接:https://www.haomeiwen.com/subject/wzmqcxtx.html