Làm cách nào để kích hoạt CORS trên Django REST Framework của tôi? các tài liệu tham khảo không giúp gì nhiều, nó nói rằng tôi có thể làm bởi một middleware, nhưng làm thế nào tôi có thể làm điều đó?
Làm cách nào để kích hoạt CORS trên Django REST Framework của tôi? các tài liệu tham khảo không giúp gì nhiều, nó nói rằng tôi có thể làm bởi một middleware, nhưng làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Liên kết bạn đã tham chiếu trong câu hỏi của mình khuyên bạn nên sử dụng django-cors-headers
, có tài liệu cho biết cài đặt thư viện
pip install django-cors-headers
và sau đó thêm nó vào các ứng dụng đã cài đặt của bạn:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Bạn cũng sẽ cần thêm một lớp phần mềm trung gian để lắng nghe các phản hồi:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Vui lòng duyệt qua phần cấu hình trong tài liệu của nó, đặc biệt chú ý đến các CORS_ORIGIN_
cài đặt khác nhau . Bạn sẽ cần đặt một số trong số đó dựa trên nhu cầu của mình.
Access-Control-Allow-Origin: *
tôi không hiểu tại sao phải tải toàn bộ, tôi sẽ đưa ra một cách khác để thực hiện điều này trong câu trả lời của bạn để cả hai phương pháp đều có sẵn. tham khảo: [link (] enable-cors.org/server.html )
django-cors-headers
linh hoạt hơn nhiều. Nếu bạn muốn tạo lớp học của riêng mình, hãy là khách của tôi. Nhưng tôi đang sử dụng thư viện đó.
pip install django-cors-headers
và sau đó thêm nó vào các ứng dụng đã cài đặt của bạn:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Bạn cũng sẽ cần thêm một lớp phần mềm trung gian để lắng nghe các phản hồi:
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',
]
thêm chi tiết: https://github.com/ottoyiu/django-cors-headers/#configuration
đọc tài liệu chính thức có thể giải quyết hầu hết mọi vấn đề
CORS_ORIGIN_ALLOW_ALL = True
, nhưng CORS_ORIGIN_WHITELIST
vẫn được thiết lập? Các tài liệu dường như làm cho nó có vẻ như điều này là không bắt buộc và dường như gây nhầm lẫn cho câu trả lời ở đây.
'corsheaders.middleware.CorsMiddleware',
cần phải nằm ở đầu danh sách, nếu không kết nối có thể bị từ chối trước khi truy cập.
Bạn có thể làm bằng cách sử dụng phần mềm trung gian tùy chỉnh, mặc dù biết rằng tùy chọn tốt nhất là sử dụng phương pháp đã thử nghiệm của gói django-cors-headers
. Với điều đó đã nói, đây là giải pháp:
tạo cấu trúc và tệp sau:
- 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
thêm vào settings.py
dòng được đánh dấu:
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
Trong trường hợp bất kỳ ai quay lại câu hỏi này và quyết định viết phần mềm trung gian của riêng họ, đây là mẫu mã cho phần mềm trung gian kiểu mới của 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
Đối với các phiên bản Django> 1.10, theo tài liệu , phần mềm MIDDLEWARE tùy chỉnh có thể được viết dưới dạng một hàm, giả sử trong tệp: yourproject/middleware.py
(như một anh em của 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
và cuối cùng, thêm đường dẫn python của chức năng này (wrt gốc của dự án của bạn) vào danh sách MIDDLEWARE trong dự án của bạn settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Dễ như ăn bánh!
open_access_middleware
.
Dưới đây là các bước làm việc mà không cần bất kỳ mô-đun bên ngoài nào:
Bước 1: Tạo một mô-đun trong ứng dụng của bạn.
Ví dụ: giả sử chúng ta có một ứng dụng có tên là user_registration_app . Khám phá user_registration_app và tạo một tệp mới.
Hãy gọi nó là custom_cors_middleware.py
Dán định nghĩa Lớp bên dưới:
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
Bước 2: Đăng ký phần mềm trung gian
Trong tệp settings.py dự án của bạn, hãy thêm dòng này
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
Ví dụ:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Hãy nhớ thay thế user_registration_app bằng tên của ứng dụng mà bạn đã tạo mô-đun custom_cors_middleware.py của mình.
Bây giờ bạn có thể xác minh rằng nó sẽ thêm các tiêu đề phản hồi bắt buộc vào tất cả các chế độ xem trong dự án!
Django = 2,2,12 django-cors-headers = 3,2,1 djangorestframework = 3,11,0
Làm theo hướng dẫn chính thức không hoạt động
Cuối cùng sử dụng cách cũ để tìm ra nó.
THÊM VÀO:
# 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',
),
}