Làm cách nào để kích hoạt CORS trên Django REST Framework


Câu trả lời:


146

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.


2
bạn có biết cách nào khác để làm điều đó mà không cần phải cài đặt phụ thuộc mới không? Tôi đang cố gắng tạo một lớp phần mềm trung gian ngay bây giờ
Julio Marins

5
@JulioMarins, tại sao bạn lại viết phiên bản của riêng mình khi phiên bản này sẵn có và có thể cài đặt dễ dàng, với 12 bản phát hành, 21 người đóng góp, hơn 800 sao và hơn 100 nhánh?
Chris

2
Bạn thực sự có lý, nhưng vì nhu cầu duy nhất cho một CORS đơn giản là một tiêu đề, 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 )
Julio Marins

2
@JulioMarins, đó sẽ là cách tiếp cận búa tạ. Nếu bạn nhìn vào liên kết cấu hình mà tôi cung cấp, bạn sẽ thấy nó django-cors-headerslinh 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 đó.
Chris

4
@Chris Tôi nghĩ bạn nên thêm CORS_ORIGIN_WHITELIST để đưa máy chủ gọi vào danh sách trắng.
Hakim

58
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 đề


4
Thêm bốn dòng bạn đã thêm vào câu trả lời của @ Chris là cần thiết để điều này có hiệu quả với tôi.
Matt D

5
Tại sao là CORS_ORIGIN_ALLOW_ALL = True, nhưng CORS_ORIGIN_WHITELISTvẫ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.
phượng hoàng

CORS_ORIGIN_ALLOW_ALL Nếu Đúng, danh sách trắng sẽ không được sử dụng và tất cả nguồn gốc sẽ được chấp nhận.
BjornW

2
Cũng nên nhớ rằng '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.
Sebastián Vansteenkiste

14

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.pydò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
)

Cảm ơn Julio! Mã phần mềm trung gian của bạn phải được cập nhật với mẫu mã @masnun. Ngoài ra, nhập không hoạt động đối với tôi, nhập từ. khắc phục sự cố: from . import corsMiddleware
Pavel Daynyak

12

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

7

Đố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!


Phương pháp được đăng trước đây sử dụng MIDDLEWARE_CLASSES chứ không phải MIDDLEWARE. Kỹ thuật này hoạt động rất downvote là chưa bôi cho :) @JulioMarins
Dhruv Batheja

1
dude, giải pháp là như nhau. Bạn đang tranh cãi về việc triển khai trên phiên bản Django. Mã của bạn cũng đang bật thụt lề sai open_access_middleware.
Julio Marins

4

Tôi không biết các bạn nhưng:

sử dụng tại đây python 3.6 và django 2.2

Đổi tên MIDDLEWARE_CLASSES thành MIDDLEWARE trong settings.py đã hoạt động.


3

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!


0

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',
    ),
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.