Bagaimana saya dapat mengaktifkan CORS pada Django REST Framework saya? yang referensi tidak banyak membantu, ia mengatakan bahwa saya bisa melakukan dengan middleware, tapi bagaimana saya bisa melakukan itu?
Bagaimana saya dapat mengaktifkan CORS pada Django REST Framework saya? yang referensi tidak banyak membantu, ia mengatakan bahwa saya bisa melakukan dengan middleware, tapi bagaimana saya bisa melakukan itu?
Jawaban:
Tautan yang Anda rujuk dalam pertanyaan Anda merekomendasikan penggunaan django-cors-headers
, yang dokumentasinya mengatakan untuk menginstal pustaka
pip install django-cors-headers
dan kemudian tambahkan ke aplikasi yang Anda instal:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Anda juga perlu menambahkan kelas middleware untuk mendengarkan tanggapan:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Silakan telusuri bagian konfigurasi dari dokumentasinya, dengan memberi perhatian khusus pada berbagai CORS_ORIGIN_
pengaturan. Anda harus mengatur beberapa di antaranya berdasarkan kebutuhan Anda.
Access-Control-Allow-Origin: *
Saya tidak mengerti mengapa memuat semuanya, saya akan memberikan cara lain untuk melakukan ini dalam jawaban Anda sehingga kedua metode dapat tersedia. referensi: [link (] enable-cors.org/server.html )
django-cors-headers
jauh lebih fleksibel dari itu. Jika Anda lebih suka membuat kelas Anda sendiri, jadilah tamu saya. Tapi saya akan menggunakan perpustakaan itu.
pip install django-cors-headers
dan kemudian tambahkan ke aplikasi yang Anda instal:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Anda juga perlu menambahkan kelas middleware untuk mendengarkan tanggapan:
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',
]
detail lebih lanjut: https://github.com/ottoyiu/django-cors-headers/#configuration
membaca dokumentasi resmi dapat menyelesaikan hampir semua masalah
'corsheaders.middleware.CorsMiddleware',
harus agak di bagian atas daftar, jika tidak koneksi mungkin ditolak sebelum mendapatkannya.
Anda dapat melakukannya dengan menggunakan middleware kustom, meskipun mengetahui bahwa opsi terbaik adalah menggunakan pendekatan paket yang telah diuji django-cors-headers
. Karena itu, inilah solusinya:
buat struktur dan file berikut:
- 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
tambahkan ke settings.py
garis yang ditandai:
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
Jika ada yang kembali ke pertanyaan ini dan memutuskan untuk menulis middleware mereka sendiri, ini adalah contoh kode untuk middleware gaya baru 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
Untuk versi Django> 1.10, menurut dokumentasinya , sebuah MIDDLEWARE kustom dapat ditulis sebagai fungsi, katakanlah dalam file: yourproject/middleware.py
(sebagai saudara dari 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
dan terakhir, tambahkan jalur python dari fungsi ini (wrt root proyek Anda) ke daftar MIDDLEWARE di proyek Anda settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Sangat mudah!
open_access_middleware
.
Yah, saya tidak tahu teman-teman tapi:
menggunakan di sini python 3.6 dan django 2.2
Mengganti nama MIDDLEWARE_CLASSES menjadi MIDDLEWARE di settings.py berhasil.
Di bawah ini adalah langkah-langkah kerja tanpa memerlukan modul eksternal:
Langkah 1: Buat modul di aplikasi Anda.
Misalnya, anggap saja kita memiliki aplikasi bernama user_registration_app . Jelajahi user_registration_app dan buat file baru.
Mari kita sebut ini sebagai custom_cors_middleware.py
Tempel definisi Kelas di bawah ini:
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
Langkah 2: Daftarkan middleware
Dalam file settings.py proyek Anda, tambahkan baris ini
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
Misalnya:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Ingatlah untuk mengganti user_registration_app dengan nama aplikasi tempat Anda membuat modul custom_cors_middleware.py.
Anda sekarang dapat memverifikasi bahwa itu akan menambahkan header respons yang diperlukan ke semua tampilan dalam proyek!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Ikuti instruksi resmi tidak berhasil
Akhirnya gunakan cara lama untuk mengetahuinya.
MENAMBAHKAN:
# 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',
),
}