Як я можу ввімкнути 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.