Öncelikle CORS Nedir?
CORS, yani "Cross-Origin Resource Sharing" (Çapraz Kaynak Paylaşımı), bir web sayfasının başka bir kaynaktan (domain, protokol veya port) gelen kaynaklara erişmesini kontrol eden bir güvenlik mekanizmasıdır. Yani, bir web sayfası başka bir sunucudan veri almak istediğinde, tarayıcı bu isteği güvenlik nedeniyle engeller. İşte burada CORS devreye girer; sunucu, gelen isteklerin hangi kaynaklardan geldiğine göre hangi isteklere izin vereceğini belirtir.
Flask'ta CORS hatası genellikle iki kaynaktan gelen istekler arasındaki erişim kısıtlamaları nedeniyle ortaya çıkar.
Flask ve CORS Hatası
Flask ile API geliştirdiğinizde, bazen frontend uygulamanız başka bir domain üzerinden API'ye erişmeye çalışır. Eğer Flask backend'iniz, gelen isteği kabul etmezse ve uygun CORS başlıkları ayarlanmamışsa, tarayıcı bu isteği engeller ve "CORS Policy" hatası alırsınız. Bu da kullanıcıların frontend ile backend arasında iletişim kuramamasına sebep olur.
Ama korkmayın! Bu hatayı çözmek, birkaç basit adımda yapılabilir.
CORS Hatasını Çözmek İçin Flask’a CORS Desteği Eklemek
Flask’ta CORS hatasını çözmenin en hızlı ve güvenli yolu, Flask-CORS kütüphanesini kullanmaktır. Flask-CORS, Flask uygulamanıza CORS başlıklarını eklemenizi sağlar ve bu şekilde dış kaynaklardan gelen istekleri güvenli bir şekilde kabul edebilirsiniz.
İşte adım adım yapmanız gerekenler:
1. Flask-CORS Kütüphanesini Kurun
İlk adım, Flask-CORS kütüphanesini projenize eklemektir. Eğer henüz yüklemediyseniz, terminal üzerinden şu komutla yükleyebilirsiniz:
pip install flask-cors
2. Flask Uygulamanıza CORS Ekleme
Flask-CORS’ı yükledikten sonra, Flask uygulamanıza basit bir şekilde ekleyebilirsiniz. Aşağıda, CORS başlıklarını tüm domainlere açan bir örnek kodu bulabilirsiniz.
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# Tüm domainlere CORS izni veriyoruz
CORS(app)
@app.route('/api', methods=['GET'])
def api():
return {'message': 'CORS başlıkları eklenmiş başarılı bir cevap!'}
if __name__ == '__main__':
app.run(debug=True)
Bu basit yapı, Flask uygulamanıza CORS başlıkları ekleyecek ve tüm dış kaynaklardan gelen istekleri kabul edecektir.
3. Belirli Kaynaklara CORS İzni Verme
Eğer sadece belirli bir domain’e (örneğin, frontend’inizin bulunduğu site) izin vermek istiyorsanız, Flask-CORS’ı daha özelleştirebilirsiniz. Örneğin:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# Sadece belirli bir domain’e izin veriyoruz
CORS(app, resources={r"/api/*": {"origins": "https://frontend-domain.com"}})
@app.route('/api', methods=['GET'])
def api():
return {'message': 'Bu sadece belirli bir domain için geçerli!'}
if __name__ == '__main__':
app.run(debug=True)
Bu durumda, sadece "https://frontend-domain.com" adresinden gelen istekler kabul edilecek.
Alternatif Yöntemler ve İpuçları
- Preflight Request: Eğer bir HTTP isteği, GET dışında başka bir metod kullanıyorsa (örneğin, POST, PUT, DELETE vb.), bu durumda "preflight" istekleri yapılır. Bu istek, tarayıcı tarafından otomatik olarak gönderilir. Eğer backend doğru şekilde CORS başlıkları döndürmezse, preflight isteği başarısız olur. Flask-CORS, preflight isteklerini otomatik olarak işler.
- CORS Başlıklarını Manuel Ayarlamak: Flask-CORS yerine, kendi başınıza CORS başlıkları eklemek isterseniz, `after_request` fonksiyonunu kullanarak her yanıtın başlıklarına CORS ekleyebilirsiniz:
from flask import Flask, jsonify
app = Flask(__name__)
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type')
return response
@app.route('/api', methods=['GET'])
def api():
return jsonify(message="Manuel CORS başlıkları eklenmiş başarılı bir cevap!")
if __name__ == '__main__':
app.run(debug=True)
Bu yöntemle de CORS hatasını çözebilirsiniz, ancak Flask-CORS kullanmak genellikle daha temiz ve daha güvenlidir.
CORS Hatasını Çözerken Dikkat Etmeniz Gerekenler
- CORS başlıklarını doğru şekilde ayarladığınızdan emin olun. Yanlış yapılandırma, güvenlik açıklarına yol açabilir.
- API’nizi yalnızca gerekli domain’lere açın. Gereksiz yere herkese açık hale getirmek, güvenlik risklerini artırır.
- Eğer frontend ve backend aynı domain üzerinde barındırılıyorsa, CORS’a gerek yoktur. Bu tür bir yapıda, her şey doğal olarak aynı kaynak üzerinden geldiği için CORS problemi yaşanmaz.
Sonuç
Flask ile CORS hatası almak gerçekten can sıkıcı olabilir, ancak Flask-CORS ile bu sorunu hızla çözebilirsiniz. İster tüm kaynaklara açın, ister sadece belirli domainlere izin verin, Flask-CORS kullanmak işinizi kolaylaştıracaktır. Artık frontend ve backend arasında sorunsuz bir iletişim sağlayabilirsiniz!