رفع خطای CORS در Flask
CORS مخفف Cross-Origin Resource Sharing است و مکانیزمی می باشد که مرورگرها از آن برای کنترل درخواستهای HTTP به منابع در دامنههای دیگر استفاده میکنند. بهطور پیشفرض، مرورگرها فقط اجازه میدهند درخواستهای انجامشده از یک دامنه (origin) به همان دامنه پاسخ داده شود (Same-Origin Policy). اگر درخواستها از یک دامنه به دامنه دیگری ارسال شوند، نیاز است که دامنه مقصد بهصورت خاص اجازه دسترسی بدهد.
CORS به دلایل امنیتی در مرورگرها پیادهسازی شده است تا از دسترسیهای غیرمجاز به منابع سرورها از طریق دامنههای دیگر جلوگیری کند. به طور پیشفرض، مرورگرها درخواستهایی که از یک دامنه خارجی ارسال میشوند را مسدود میکنند، مگر اینکه سرور صراحتاً اجازه این کار را بدهد.
برای رفع مشکل مذکور در Flask، از افزونه Flask-Cors استفاده میشود که امکان تنظیم سیاستهای CORS را برای سرور ارائه می دهد.
مراحل رفع خطای CORS در Flask
1- نصب افزونه Flask-Cors:
مطابق با دستور زیر نسبت به نصب کتابخانه Flask-Cors اقدام کنید:
pip install flask-cors
2- اضافه کردن Flask-Cors به پروژه
پس از نصب، باید Flask-Cors را در پروژه خود وارد کرده و آن را برای استفاده در برنامه تنظیم کنید. یک مثال ساده به صورت زیر است که پیرو آن، ارسال درخواستها از هر دامنهای به سرور شما مجاز خواهند بود:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route('/example')
def example():
return {"message": "CORS is enabled!"}
if __name__ == '__main__':
app.run(debug=True)
3- تنظیم دقیق CORS
گاهی اوقات نیاز است که فقط به دامنههای خاص اجازه دسترسی بدهید. برای این کار میتوانید سیاستهای CORS را به صورت دقیق تنظیم کنید. مثال زیر نشان میدهد چگونه میتوان فقط درخواستهایی از دامنه https://example.com را مجاز نمود:
CORS(app, resources={r"/api/*": {"origins": "https://example.com"}})
در این مثال، فقط مسیرهایی که با /api/ شروع میشوند و از دامنه https://example.com درخواست میشوند، مجاز هستند.
4- تنظیم CORS برای مسیرهای خاص
اگر بخواهید سیاستهای CORS را فقط برای یک یا چند مسیر مشخص اعمال کنید، میتوانید از دکوراتور cross_origin@ استفاده نمایید:
from flask_cors import cross_origin
@app.route('/specific')
@cross_origin(origins="https://example.com")
def specific_route():
return {"message": "CORS is enabled for this route only!"}
در این حالت، فقط مسیر خاص مدنظر به درخواستهای دامنه https://example.com پاسخ خواهد داد.