Für die folgende ajax
Postanfrage für Flask
( wie kann ich Daten verwenden, die von Ajax in der Flasche gepostet wurden? ):
$.ajax({
url: "http://127.0.0.1:5000/foo",
type: "POST",
contentType: "application/json",
data: JSON.stringify({'inputVar': 1}),
success: function( data ) {
alert( "success" + data );
}
});
Ich erhalte eine Cross Origin Resource Sharing (CORS)
Fehlermeldung:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'null' is therefore not allowed access.
The response had HTTP status code 500.
Ich habe versucht, es auf zwei Arten zu lösen, aber keine scheint zu funktionieren.
- Verwenden von Flask-CORS
Dies ist eine Flask
Erweiterung für die Handhabung CORS
, die originenspezifisches AJAX ermöglichen soll.
- http://flask-cors.readthedocs.org/en/latest/
- So aktivieren Sie CORS in Kolben und Heroku
- Der Flask-Cors-Wrapper funktioniert nicht, wenn der JWT-Auth-Wrapper angewendet wird.
- Javascript - In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden
Mein pythonServer.py mit dieser Lösung:
from flask import Flask
from flask.ext.cors import CORS, cross_origin
app = Flask(__name__)
cors = CORS(app, resources={r"/foo": {"origins": "*"}})
app.config['CORS_HEADERS'] = 'Content-Type'
@app.route('/foo', methods=['POST','OPTIONS'])
@cross_origin(origin='*',headers=['Content-Type','Authorization'])
def foo():
return request.json['inputVar']
if __name__ == '__main__':
app.run()
- Verwendung eines bestimmten Kolbendekorateurs
Dies ist ein offizielles Flask-Code-Snippet, das einen Dekorateur definiert, der die CORS
von ihm dekorierten Funktionen berücksichtigen soll.
- http://flask.pocoo.org/snippets/56/
- Standortübergreifender HTTP-POST für Python Flask - funktioniert nicht für bestimmte zulässige Ursprünge
- http://chopapp.com/#351l7gc3
Mein pythonServer.py mit dieser Lösung:
from flask import Flask, make_response, request, current_app
from datetime import timedelta
from functools import update_wrapper
app = Flask(__name__)
def crossdomain(origin=None, methods=None, headers=None,
max_age=21600, attach_to_all=True,
automatic_options=True):
if methods is not None:
methods = ', '.join(sorted(x.upper() for x in methods))
if headers is not None and not isinstance(headers, basestring):
headers = ', '.join(x.upper() for x in headers)
if not isinstance(origin, basestring):
origin = ', '.join(origin)
if isinstance(max_age, timedelta):
max_age = max_age.total_seconds()
def get_methods():
if methods is not None:
return methods
options_resp = current_app.make_default_options_response()
return options_resp.headers['allow']
def decorator(f):
def wrapped_function(*args, **kwargs):
if automatic_options and request.method == 'OPTIONS':
resp = current_app.make_default_options_response()
else:
resp = make_response(f(*args, **kwargs))
if not attach_to_all and request.method != 'OPTIONS':
return resp
h = resp.headers
h['Access-Control-Allow-Origin'] = origin
h['Access-Control-Allow-Methods'] = get_methods()
h['Access-Control-Max-Age'] = str(max_age)
if headers is not None:
h['Access-Control-Allow-Headers'] = headers
return resp
f.provide_automatic_options = False
return update_wrapper(wrapped_function, f)
return decorator
@app.route('/foo', methods=['GET','POST','OPTIONS'])
@crossdomain(origin="*")
def foo():
return request.json['inputVar']
if __name__ == '__main__':
app.run()
Können Sie bitte einen Hinweis geben, warum das so ist?