Django REST Framework üzerinde CORS'u nasıl etkinleştirebilirim


Yanıtlar:


166

Sorunuzda başvurduğunuz bağlantı django-cors-headers, dokümantasyonu kitaplığı kurmanızı söyleyen bağlantıyı kullanmanızı önerir.

pip install django-cors-headers

ve sonra onu yüklü uygulamalarınıza ekleyin:

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

Ayrıca yanıtları dinlemek için bir ara yazılım sınıfı eklemeniz gerekecektir:

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

Lütfen çeşitli ayarlara özellikle dikkat ederek belgelerinin yapılandırma bölümüne göz atın CORS_ORIGIN_. Bunlardan bazılarını ihtiyaçlarınıza göre ayarlamanız gerekecek.


2
Yeni bir bağımlılık kurmaya gerek kalmadan bunu yapmanın başka bir yolunu biliyor musunuz? Şimdi bir ara katman sınıfı oluşturmaya çalışıyorum
Julio Marins

5
@JulioMarins, 12 sürüm, 21 katkıda bulunan, 800'den fazla yıldız ve 100'den fazla çatal ile bu kullanıma hazır ve kolayca kurulabilirken neden kendi sürümünüzü yazasınız?
Chris

2
Gerçekten bir fikriniz var, ancak basit bir CORS'a olan tek ihtiyaç bir başlık olduğundan, Access-Control-Allow-Origin: *neden bir şeyi bütün olarak yüklediğini anlamıyorum, cevabınıza bunu yapmanın başka bir yolunu koyacağım, böylece her iki yöntem de kullanılabilir. referans: [link (] enable-cors.org/server.html )
Julio Marins

2
@JulioMarins, bu balyoz yaklaşımı olurdu. Sağladığım yapılandırma bağlantısına bakarsanız, django-cors-headersbundan çok daha esnek olduğunu göreceksiniz . Kendi sınıfınızı oluşturmayı tercih ederseniz, misafirim olun. Ama o kütüphaneyi kullanacağım.
Chris

4
@Chris Bence arayan ana bilgisayarı beyaz listeye eklemek için CORS_ORIGIN_WHITELIST eklemelisiniz .
Hakim

71
pip install django-cors-headers

ve sonra onu yüklü uygulamalarınıza ekleyin:

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

Ayrıca yanıtları dinlemek için bir ara yazılım sınıfı eklemeniz gerekecektir:

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',
]

daha fazla ayrıntı: https://github.com/ottoyiu/django-cors-headers/#configuration

resmi belgeleri okumak neredeyse tüm sorunları çözebilir


4
@ Chris'in cevabına eklediğiniz dört satırı eklemek, bunun benim için çalışması için gerekliydi.
Matt D

5
Neden CORS_ORIGIN_ALLOW_ALL = Trueama CORS_ORIGIN_WHITELISThala ayarlanmış mı? Dokümanlar , bunun gerekli olmadığını ve buradaki cevap için kafa karıştırıcı göründüğünü gösteriyor.
phoenix

CORS_ORIGIN_ALLOW_ALL True ise, beyaz liste kullanılmayacak ve tüm kaynaklar kabul edilecektir.
BjornW

3
Ayrıca 'corsheaders.middleware.CorsMiddleware',listenin en başında olması gerektiğini unutmayın , aksi takdirde bağlantı ulaşılmadan reddedilebilir.
Sebastián Vansteenkiste

17

En iyi seçeneğin paketin test edilmiş yaklaşımını kullanmak olduğunu bilseniz bile, özel bir ara yazılım kullanarak yapabilirsiniz django-cors-headers. Bununla birlikte, işte çözüm:

aşağıdaki yapıyı ve dosyaları oluşturun:

- 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.pyişaretli satıra ekleyin :

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
)

Teşekkürler Julio! Ara yazılım kodunuz @masnun kod örneği ile güncellenmelidir. Ayrıca, alanından içe aktarma benim için çalışmıyor. sorunu from . import corsMiddleware
çözer

14

Herhangi birinin bu soruya geri dönmesi ve kendi ara katman yazılımını yazmaya karar vermesi durumunda, bu Django'nun yeni stil ara yazılımı için bir kod örneğidir -

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 sürümleri için, belgelere göre , özel bir ORTA YAZILIM bir işlev olarak yazılabilir, diyelim ki dosyada: yourproject/middleware.py(kardeş olarak 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

ve son olarak, projenizin ORTA YAZILIM listesine bu fonksiyonun python yolunu ekleyin (projenizin köküne göre) settings.py:

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

Basit!


Daha önce yayınlanan yaklaşım MIDDLEWARE_CLASSES kullanır ve MIDDLEWARE'i kullanmaz. Bu teknik işe yarıyor, bu yüzden olumsuz oy :) @JulioMarins
Dhruv Batheja

1
dostum, çözüm aynı. Django sürümünün uygulanmasını tartışıyorsunuz. Kodunuz da yanlış girintiye sahip open_access_middleware.
Julio Marins

5

Herhangi bir harici modüle ihtiyaç duymadan çalışma adımları aşağıdadır:

1. Adım: Uygulamanızda bir modül oluşturun.

Örneğin, user_registration_app adında bir uygulamamız olduğunu varsayalım . User_registration_app'i keşfedin ve yeni bir dosya oluşturun.

Bu çağrı Sağlar custom_cors_middleware.py

Aşağıdaki Sınıf tanımını yapıştırın:

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. Adım: Ara yazılım kaydettirin

Projelerinizin settings.py dosyasında bu satırı ekleyin

'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'

Örneğin:

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

    ]

User_registration_app'i custom_cors_middleware.py modülünüzü oluşturduğunuz uygulamanızın adıyla değiştirmeyi unutmayın .

Artık projedeki tüm görünümlere gerekli yanıt başlıklarını ekleyeceğini doğrulayabilirsiniz!


Teşekkür ederim! Access-Control-Allow-Headers başlığını kaçırdım.
Dan

4

Şey, erkekleri tanımıyorum ama:

burada python 3.6 ve django 2.2 kullanarak

Settings.py'de MIDDLEWARE_CLASSES olarak MIDDLEWARE olarak yeniden adlandırma çalıştı.


0

Django = 2.2.12 django-cors-başlıkları = 3.2.1 djangorestframework = 3.11.0

Resmi talimatı izleyin işe yaramıyor

Sonunda anlamak için eski yöntemi kullanın.

EKLE:

# 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',
    ),
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.