Django REST Çerçevemde CORS'u nasıl etkinleştirebilirim? Referans ben bir katman tarafından yapabileceği söylüyor, çok yardımcı olmuyor, ama nasıl bunu yapabilir mi?
Django REST Çerçevemde CORS'u nasıl etkinleştirebilirim? Referans ben bir katman tarafından yapabileceği söylüyor, çok yardımcı olmuyor, ama nasıl bunu yapabilir mi?
Yanıtlar:
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.
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 )
django-cors-headers
bundan ç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.
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
CORS_ORIGIN_ALLOW_ALL = True
ama CORS_ORIGIN_WHITELIST
hala ayarlanmış mı? Dokümanlar , bunun gerekli olmadığını ve buradaki cevap için kafa karıştırıcı göründüğünü gösteriyor.
'corsheaders.middleware.CorsMiddleware',
listenin en başında olması gerektiğini unutmayın , aksi takdirde bağlantı ulaşılmadan reddedilebilir.
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.py
iş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
)
from . import corsMiddleware
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
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!
open_access_middleware
.
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!
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',
),
}