Javascript 瓶子.py-“;否';访问控制允许原点';请求的资源上存在标头”;

Javascript 瓶子.py-“;否';访问控制允许原点';请求的资源上存在标头”;,javascript,python,bottle,Javascript,Python,Bottle,我已设置以下瓶子路径: import tornado from bottle import route, run, hook, response import cudpred as cp _allow_origin = '*' _allow_methods = 'PUT, GET, POST, DELETE, OPTIONS' _allow_headers = 'Authorization, Origin, Accept, Content-Type, X-Requested-With, X-C

我已设置以下瓶子路径:

import tornado
from bottle import route, run, hook, response
import cudpred as cp

_allow_origin = '*'
_allow_methods = 'PUT, GET, POST, DELETE, OPTIONS'
_allow_headers = 'Authorization, Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'

@hook('after_request') 
def enable_cors():
    '''Add headers to enable CORS'''

    response.headers['Access-Control-Allow-Origin'] = _allow_origin
    response.headers['Access-Control-Allow-Methods'] = _allow_methods
    response.headers['Access-Control-Allow-Headers'] = _allow_headers

@route('/', method = 'OPTIONS')
@route('/<path:path>', method = 'OPTIONS')
def options_handler(path = None):
    return

@route('/mapjson/<weekdaytopredict:int>/<hourtopredict:int>')
def mapjson(weekdaytopredict=0, hourtopredict=0):
    return cp.writeGeoJSON(weekdaytopredict, hourtopredict)


@route('/preddt/<weekdaytopredict:int>/<hourtopredict:int>/<predictionmethod:int>/<normalization:int>')
def preddt(weekdaytopredict=0, hourtopredict=0, predictionmethod =0, normalization=0):
    return cp.predicitonCalculator(weekdaytopredict, hourtopredict, predictionmethod, normalization)

run(server='tornado', host='0.0.0.0', port=2526, debug=False, reloader=True)
我的问题是,这适用于
mapjson
调用,但不适用于
preddt
调用。每当我运行对
mapjson
的任何请求时,如果我尝试访问
http://remote_machine:port/preddt
通过参数,我可以得到:

XMLHttpRequest cannot load http://remote_machine:port/preddt/4/21/1/0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://my.hosted.website.com' is therefore not allowed access. The response had HTTP status code 500.

我遗漏了什么,如何修复?

线索是,在您发布的错误消息末尾:
响应的HTTP状态代码为500

您的
/preddt
路由正在返回HTTP 500。您对
cp.predictioncalculator
的调用可能是罪魁祸首

我很惊讶,你们并没有在你们的瓶子控制台上看到错误;也许龙卷风把它们放进了日志文件?我要找一个

其他简单的尝试:

  • 尝试在没有Tornado的情况下运行它,以查看服务器错误的原因是否变得更加明显,例如,打印在控制台上

  • 设置瓶子的
    debug=True
    。(您现在已将其设置为
    False
    ,不确定原因。)

  • 使用curl点击服务器,这样您就可以比使用浏览器更直接地检查HTTP响应和标题

  • 要证明它确实是
    cp.predicitioncalculator
    ,请修改
    preddt
    函数以简单地返回字符串。您将不再收到HTTP 500错误(并且您的CORS头将工作)

(此外,从长远来看,after_请求挂钩可能不是最可靠的解决方法。)

祝你好运

function updateMap(e, weekday, hour, model, normalization){
    e.preventDefault();
    if (typeof(weekday) == 'undefined' || typeof(hour) == 'undefined' || weekday == '' || hour == '') {
        mapurl = 'mymap.url';
    } else if(model == 0) {
        mapurl = 'http://remote_machine:port/mapjson/' + weekday + '/' + hour
    } else {
        mapurl = 'http://remote_machine:port/preddt/' + weekday + '/' + hour + '/' + model + '/' + normalization
    }
    ...ETC...
}
XMLHttpRequest cannot load http://remote_machine:port/preddt/4/21/1/0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://my.hosted.website.com' is therefore not allowed access. The response had HTTP status code 500.