search icon
در حال جستجو...

رفع خطای Access-Control-Allow-Origin (CORS) در Flask

خطای Access-Control-Allow-Origin متوقف‌ کنندهٔ امنیتی مرورگرها برای جلوگیری از دسترسی غیرمجاز وب‌سایت‌ها به منابع یکدیگر است.

این خطا زمانی رخ می‌دهد که مرورگر شما بخواهد از یک دامنه، پروتکل یا پورت متفاوت به سروری دیگر درخواست (HTTP Request) ارسال کند.

در این حالت، مرورگر برای حفظ امنیت، ابتدا بررسی می‌کند که آیا آدرس مقصد اجازه دسترسی به این آدرس را صادر کرده است یا خیر.

اگر آدرس مقصد هدر Access-Control-Allow-Origin را در پاسخ خود نفرستاده باشد یا آدرس مبدا در آن تعریف نشده باشد، مرورگر جلوی دریافت اطلاعات را می‌گیرد و این خطا را نمایش می‌دهد.

برای مثال، اگر Frontend روی:

https://example.com

و API روی:

https://api.example.com

قرار داشته باشد، مرورگر بررسی می‌کند که آیا API اجازه دریافت درخواست از https://example.com را دارد یا خیر. در صورت عدم اجازه، خطایی مانند زیر نمایش داده می‌شود:

Access to fetch ... has been blocked by CORS policy

رفع خطا در Flask

برای تنظیم CORS در Flask می‌توانید از پکیج flask-cors استفاده کنید.

ابتدا پکیج را نصب کنید:

pip install flask-cors

سپس در فایل اصلی برنامه، CORS را import کرده و آن را فعال کنید:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)

CORS(app)

با این تنظیم، درخواست‌ها از تمام دامنه ها مجاز خواهند بود.

محدود کردن دسترسی به یک دامنه خاص

اگر می‌خواهید فقط یک دامنه مشخص اجازه دسترسی به API را داشته باشد، می‌توانید Origin موردنظر را مشخص کنید:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)

CORS(app, origins=['https://example.com'])

در این حالت فقط درخواست‌هایی که از https://example.com ارسال شوند مجاز خواهند بود.

محدود کردن CORS به مسیر API

اگر فقط می‌خواهید CORS برای مسیرهای API فعال باشد، می‌توانید تنظیمات را به شکل زیر انجام دهید:

CORS(app, resources={
    r'/api/*': {
        'origins': 'https://example.com'
    }
})

در این حالت تنظیمات CORS فقط برای مسیرهایی که با /api/ شروع می‌شوند اعمال خواهد شد.

پس از اعمال تغییرات، سرویس Flask را مجدد Deploy کنید تا تنظیمات جدید اعمال شوند.

 

نکته:

در محیط Production بهتر است به جای اجازه دسترسی از تمام دامنه ها، فقط دامنه‌ های مورد نیاز را مشخص کنید.