CORS (Cross-Origin Resource Sharing) è un meccanismo che consente a un'applicazione web in esecuzione su un dominio di accedere alle risorse di un altro dominio. In Flask, si può usare l'estensione flask-cors
, ma in questo articolo vedremo come implementarlo manualmente, da zero.
Cos'è CORS?
Quando un browser effettua una richiesta da un'origine diversa da quella del server, invia automaticamente degli header come Origin
e, in alcuni casi, effettua una richiesta preflight (con metodo OPTIONS
). Il server deve rispondere con header CORS specifici per autorizzare l'accesso.
Obiettivo
Permettere richieste da un'origine specifica (es. http://localhost:3000
) rispondendo con gli header corretti.
1. Impostare Flask
from flask import Flask, request, jsonify
app = Flask(__name__)
2. Middleware CORS personalizzato
Creiamo una funzione da eseguire dopo ogni richiesta per aggiungere gli header necessari:
@app.after_request
def add_cors_headers(response):
response.headers['Access-Control-Allow-Origin'] = 'http://localhost:3000'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
return response
3. Gestire le richieste OPTIONS (preflight)
Flask, di default, non risponde automaticamente con i giusti header alle richieste OPTIONS
. Li gestiamo manualmente:
@app.route('/api/data', methods=['GET', 'POST', 'OPTIONS'])
def handle_data():
if request.method == 'OPTIONS':
response = app.make_response('')
response.headers['Access-Control-Allow-Origin'] = 'http://localhost:3000'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
return response, 204
data = {'message': 'CORS abilitato'}
return jsonify(data)
4. Avvio dell'app
if __name__ == '__main__':
app.run(debug=True)
Conclusione
Con questa semplice implementazione, hai pieno controllo su come vengono gestite le policy CORS nella tua app Flask. Questo approccio è utile quando vuoi evitare dipendenze esterne o comprendere a fondo il funzionamento di CORS.