Ich habe die folgende Flasche Routing einrichten:Bottle.py - „Nein" Access-Control-Allow-Origin-Header auf die angeforderte Ressource vorhanden ist“
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)
Ich mache einen API-Aufruf durch ein HTML-<form>
die mit einer JavaScript-Funktion verbunden ist, die dann die API-Aufrufe:
<form onSubmit=" return updateMap(event, document.getElementById('weekday').value, document.getElementById('hour').value, document.getElementById('method').value, document.getElementById('normalization').value)">
...</* Form />...
</form>
Und die JavaScript-Funktion ist:
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...
}
Mein Problem ist, dass dies für den Anruf mapjson
funktioniert, aber nicht für den Anruf preddt
funktioniert. Jedes Mal, wenn ich wieder einen Antrag auf mapjson
laufen, es gibt die angeforderten Ausgabe ohne ein Problem, aber wenn ich den Zugriff auf http://remote_machine:port/preddt
mit Parametern versuchen, erhalte ich:
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.
Was soll ich fehlen, wie dieses Problem beheben?