今天在使用bottle的时候,前端访问请求后端一直出现跨域问题,如下:
Access to XMLHttpRequest at 'http://127.0.0.1:8080/hello' from origin
'http://localhost:63343' has been blocked by CORS policy: No 'Access-
Control-Allow-Origin' header is present on the requested resource.
本来就不怎么会前端,又碰到了大名鼎鼎的跨域问题很是烦躁,问同学说跨域问题解决方案就跟茴香豆的写法一样多,彻底无语。
百度了很多答案,无非是使用@hook
与修改Bottle源码,我一一试了下都不管用,也不知道为什么就是提示跨域。
第二天继续查找解决办法,看了很多还是不行,最后看到这篇博客:https://simpledao.win/2018/05/20/python-bottle%E8%A7%A3%E5%86%B3%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/。办法依旧是使用@hook
,复制进自己的代码中还是不管用。
最后我发现我import的好像比较少,就把他引用的模块也复制进去了,神奇的事情发生了,竟然成功了!!!
我没有引用response,这竟然也会导致跨域!!
网上大多数解决方案都只有一小部分代码,忽略了导入模块的问题,怪不得我好久都没解决。最后附上我很简陋的测试代码。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 错误版本
# from bottle import template, Bottle, hook
from bottle import template, Bottle, response
root = Bottle()
# 解决跨域问题https://simpledao.win/2018/05/20/python-bottle%E8%A7%A3%E5%86%B3%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/
@root.hook('after_request')
def enable_cors():
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
@root.route('/hello')
def index():
return "hello world"
root.run(host='127.0.0.1', port=8080)
希望能帮助到大家。