Як я можу ввімкнути CORS на Django REST Framework


Відповіді:


146

Посилання, на яке ви посилаєтесь у своєму запитанні, рекомендує використовувати django-cors-headers, чия документація говорить про встановлення бібліотеки

pip install django-cors-headers

а потім додайте його до встановлених програм:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

Вам також потрібно буде додати клас проміжного програмного забезпечення, щоб слухати відповіді:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

Будь ласка, перегляньте розділ конфігурації в його документації, звертаючи особливу увагу на різні CORS_ORIGIN_налаштування. Вам потрібно буде встановити деякі з них відповідно до ваших потреб.


2
чи знаєте ви будь-який інший спосіб зробити це без необхідності встановлювати нову залежність? Зараз я намагаюся створити клас проміжного програмного забезпечення
— Julio Marins

5
@JulioMarins, чому б ви писали власну версію, коли вона легко доступна і легко встановлюється, з 12 релізами, 21 автором, понад 800 зірок і понад 100 форками?
— Кріс

2
Ви справді маєте думку, але оскільки єдина потреба у простому CORS - це заголовок, Access-Control-Allow-Origin: *я не розумію, навіщо завантажувати цілу річ, у вашій відповіді я покладу інший спосіб, щоб обидва методи були доступними. посилання: [посилання (] enable-cors.org/server.html )
— Хуліо Марінс

2
@JulioMarins, це був би підхід кувалди. Якщо ви подивитесь на посилання конфігурації, яке я надав, ви побачите, що django-cors-headersвоно набагато гнучкіше, ніж це. Якщо ви бажаєте створити власний клас, будьте моїм гостем. Але я б користувався цією бібліотекою.
— Кріс

4
@Chris Я думаю, що вам слід додати CORS_ORIGIN_WHITELIST, щоб ви дозволили хоста, що телефонує, у білий список.
— Хакім,

58
pip install django-cors-headers

а потім додайте його до встановлених програм:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

Вам також потрібно буде додати клас проміжного програмного забезпечення, щоб слухати відповіді:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',  
    'django.middleware.common.CommonMiddleware',  
    ...
)

CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
    'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
    'http://localhost:3030',
]

детальніше: https://github.com/ottoyiu/django-cors-headers/#configuration

прочитавши офіційну документацію, можна вирішити майже всі проблеми


4
Додавання чотирьох рядків, які ви додали до відповіді @ Chris, було необхідним, щоб це спрацювало для мене.
— Matt D

5
Чому так CORS_ORIGIN_ALLOW_ALL = True, але CORS_ORIGIN_WHITELISTвсе ще встановлено? Здається, у документах здається, що це не потрібно, і, здається, бентежить відповідь тут.
— Фенікс

CORS_ORIGIN_ALLOW_ALL Якщо значення True, білий список не використовуватиметься, а всі джерела прийматимуться.
— BjornW

2
Також майте на увазі, що 'corsheaders.middleware.CorsMiddleware',потрібно бути швидше у верхній частині списку, інакше підключення може бути відхилено до того, як дістатися до нього.
— Себастьян Ванстінкісті

14

Ви можете зробити це за допомогою власного проміжного програмного забезпечення, хоча знаючи, що найкращим варіантом є використання перевіреного підходу пакету django-cors-headers. З урахуванням сказаного, ось рішення:

створити таку структуру та файли:

- myapp/middleware/__init__.py

from corsMiddleware import corsMiddleware

- myapp/middleware/corsMiddleware.py

class corsMiddleware(object):
    def process_response(self, req, resp):
        resp["Access-Control-Allow-Origin"] = "*"
        return resp

додати до settings.pyпозначеного рядка:

MIDDLEWARE_CLASSES = (
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",

    # Now we add here our custom middleware
     'app_name.middleware.corsMiddleware' <---- this line
)

Дякую Хуліо! Ваш код проміжного програмного забезпечення слід оновити за допомогою зразка коду @masnun. Крім того, імпорт не працює для мене, імпортуючи з. вирішує проблему: from . import corsMiddleware
— Павло Дайняк

12

Якщо хтось повернеться до цього питання і вирішить написати власне проміжне програмне забезпечення, це зразок коду для нового проміжного програмного забезпечення Django -

class CORSMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"

        return response

7

Для версій Django> 1.10, згідно з документацією , спеціальний MIDDLEWARE можна записати як функцію, скажімо у файлі: yourproject/middleware.py(як рідний брат settings.py):

def open_access_middleware(get_response):
    def middleware(request):
        response = get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        return response
    return middleware

і, нарешті, додайте шлях python до цієї функції (з коренем вашого проекту) до списку MIDDLEWARE у вашому проекті settings.py:

MIDDLEWARE = [
  .
  .
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

Простенька!


Підхід, розміщений раніше, використовує MIDDLEWARE_CLASSES, а не MIDDLEWARE. Ця техніка працює, тому голос проти не був викликаний :) @JulioMarins
— Dhruv Batheja

1
чувак, рішення те саме. Ви сперечаєтесь про реалізацію у версії Django. Ваш код також має неправильний відступ open_access_middleware.
— Хуліо Марінс

4

Ну, я не знаю хлопців, але:

використовуючи тут python 3.6 та django 2.2

Перейменування MIDDLEWARE_CLASSES на MIDDLEWARE у settings.py спрацювало.


3

Нижче наведені робочі кроки без потреби в будь-яких зовнішніх модулях:

Крок 1: Створіть модуль у своєму додатку.

Наприклад, припустимо, що у нас є додаток user_registration_app . Дослідіть user_registration_app і створіть новий файл.

Давайте назвемо це як custom_cors_middleware.py

Вставте наведене нижче визначення класу:

class CustomCorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"

        # Code to be executed for each request/response after
        # the view is called.

        return response

Крок 2: Зареєструйте проміжне програмне забезпечення

Додайте цей рядок у свій файл settings.py

'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'

Наприклад:

  MIDDLEWARE = [
        'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
         ...
        'django.middleware.common.CommonMiddleware',

    ]

Не забудьте замінити user_registration_app на ім'я вашої програми, де ви створили свій модуль custom_cors_middleware.py.

Тепер ви можете перевірити, що він додасть необхідні заголовки відповідей до всіх подань у проекті!


0

Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0

Дотримуйтесь офіційних інструкцій, не працює

Нарешті, використовуйте старий спосіб це зрозуміти.

ДОДАТИ:

# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication


class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening
#proj/settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'proj.middlewares.CsrfExemptSessionAuthentication',
    ),
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.