मैं Django बाकी फ्रेमवर्क पर कॉर्स को कैसे सक्षम कर सकता हूं


98

मैं अपने Django REST फ्रेमवर्क पर CORS को कैसे सक्षम कर सकता हूं? संदर्भ ज्यादा मदद नहीं करता है, यह दर्शाता है कि मैं एक मध्यस्थ द्वारा कर सकते हैं, लेकिन मैं कैसे कर सकते हैं?

जवाबों:


145

आपके प्रश्न में संदर्भित लिंक का उपयोग करने की अनुशंसा करता है django-cors-headers, जिसका प्रलेखन पुस्तकालय को स्थापित करने के लिए कहता है

pip install django-cors-headers

और फिर इसे अपने इंस्टॉल किए गए ऐप्स में जोड़ें:

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

प्रतिक्रियाओं पर सुनने के लिए आपको एक मिडलवेयर क्लास जोड़ना होगा:

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

कृपया अपने दस्तावेज़ के कॉन्फ़िगरेशन अनुभाग को ब्राउज़ करें , विभिन्न CORS_ORIGIN_सेटिंग्स पर विशेष ध्यान दें । आपको अपनी आवश्यकताओं के आधार पर उनमें से कुछ को सेट करना होगा।


2
क्या आप ऐसा करने का कोई अन्य तरीका जानते हैं, बिना किसी नई निर्भरता को स्थापित करने की आवश्यकता के? मैं अब एक मिडलवेयर क्लास बनाने की कोशिश कर रहा हूं
जूलियो मैरिंस

5
@JulioMarins, जब आप 12 संस्करण, 21 योगदानकर्ताओं, 800 से अधिक सितारों और 100 से अधिक कांटे के साथ आसानी से उपलब्ध और आसानी से इंस्टॉल करने योग्य है, तो आप अपना संस्करण क्यों लिखेंगे?
क्रिस

2
आपके पास वास्तव में एक बिंदु है, लेकिन चूंकि केवल एक सरल कॉर्स की आवश्यकता है एक हेडर है जो Access-Control-Allow-Origin: *मुझे नहीं दिखता है कि एक पूरी चीज को क्यों लोड किया जाए, मैं आपके जवाब में ऐसा करने का एक और तरीका रखूंगा ताकि दोनों तरीके उपलब्ध हो सकें। संदर्भ: [लिंक (] enable-cors.org/server.html )
जूलियो

2
@JulioMarins, यह स्लेजहेमर दृष्टिकोण होगा। यदि आप मेरे द्वारा दिए गए कॉन्फ़िगरेशन लिंक को देखते हैं तो आप देखेंगे कि इससे django-cors-headersबहुत अधिक लचीला है। यदि आप अपना स्वयं का वर्ग बनाना चाहते हैं, तो मेरे अतिथि बनें। लेकिन मैं उस पुस्तकालय का उपयोग करूंगा।
क्रिस

4
@ मुझे लगता है कि आपको CORS_ORIGIN_WHITELIST जोड़ना चाहिए ताकि आप कॉलिंग होस्ट को श्वेतसूची में ला सकें।
हकीम

57
pip install django-cors-headers

और फिर इसे अपने इंस्टॉल किए गए ऐप्स में जोड़ें:

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

प्रतिक्रियाओं पर सुनने के लिए आपको एक मिडलवेयर क्लास जोड़ना होगा:

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

अधिक जानकारी: https://github.com/ottoyiu/django-cors-headers/#configuration

आधिकारिक दस्तावेज को पढ़ने से लगभग सभी समस्याएँ हल हो सकती हैं


4
@ क्रिस के जवाब में आपके द्वारा जोड़ी गई चार लाइनों को जोड़ना मेरे लिए काम करने के लिए आवश्यक था।
मैट डी

5
क्यों है CORS_ORIGIN_ALLOW_ALL = True, लेकिन CORS_ORIGIN_WHITELISTअभी भी सेट है? डॉक्स यह प्रतीत होता है कि ऐसा लगता है कि यह आवश्यक नहीं है और यहां उत्तर के लिए भ्रमित हो रहा है।
फीनिक्स

CORS_ORIGIN_ALLOW_ALL यदि सही है, तो श्वेतसूची का उपयोग नहीं किया जाएगा और सभी मूल स्वीकार किए जाएंगे।
ब्योर्नॉ

2
यह भी ध्यान रखें 'corsheaders.middleware.CorsMiddleware',कि सूची में सबसे ऊपर होना चाहिए, अन्यथा इसे प्राप्त करने से पहले कनेक्शन को अस्वीकार कर दिया जा सकता है।
सेबेस्टियन वनस्टीनकिस्टे

14

आप कस्टम मिडलवेयर का उपयोग करके कर सकते हैं, भले ही यह जानते हुए कि पैकेज के परीक्षण किए गए दृष्टिकोण का उपयोग करना सबसे अच्छा विकल्प है django-cors-headers। उस ने कहा, यहाँ समाधान है:

निम्न संरचना और फ़ाइलें बनाएँ:

- 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चिह्नित लाइन में जोड़ें :

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
)

धन्यवाद जूलियो! आपके मिडलवेयर कोड को @masnun कोड नमूने के साथ अपडेट किया जाना चाहिए। इसके अलावा, आयात मेरे लिए, आयात से काम नहीं करता है। इस मुद्दे को हल करता है: from . import corsMiddleware
पावेल डेनायक

12

यदि कोई इस प्रश्न पर वापस जा रहा है और अपना मिडलवेयर लिखने का निर्णय ले रहा है, तो यह 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

Django संस्करणों के लिए> 1.10, प्रलेखन के अनुसार , एक कस्टम MIDDLEWARE को एक फ़ंक्शन के रूप में लिखा जा सकता है, चलो फ़ाइल में कहते हैं: yourproject/middleware.py(एक भाई के रूप में 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

और अंत में, इस फ़ंक्शन के अजगर पथ (अपनी परियोजना की जड़ को) को अपने प्रोजेक्ट के MIDDLEWARE सूची में जोड़ें settings.py:

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

बहुत आसान!


MIDDLEWARE_CLASSES और MIDDLEWARE का उपयोग करने से पहले पोस्ट किया गया दृष्टिकोण। यह तकनीक काम करती है इसलिए डाउनवोट के लिए अनवील किया गया :) @JulioMarins
ध्रुव बठेजा

1
दोस्त, समाधान एक ही है। आप Django संस्करण पर कार्यान्वयन के बारे में बहस कर रहे हैं। आपका कोड भी गलत इंडेंटेशन के साथ है open_access_middleware
जूलियो मरींस

4

ठीक है, मैं लोगों को नहीं जानता लेकिन:

यहाँ अजगर 3.6 और django 2.2 का उपयोग कर रहा है

MIDDLEWARE_CLASSES का नामकरण सेटिंग में MIDDLEWARE करने के लिए काम किया।


3

नीचे किसी भी बाहरी मॉड्यूल की आवश्यकता के बिना काम कर रहे कदम हैं:

चरण 1: अपने ऐप में एक मॉड्यूल बनाएं।

उदाहरण के लिए, मान लेते हैं कि हमारे पास एक ऐप है जिसे कहा जाता है user_registration_app। User_registration_app एक्सप्लोर करें और एक नई फ़ाइल बनाएँ।

इस रूप में कहते हैं custom_cors_middleware.py कहते हैं

नीचे वर्ग की परिभाषा चिपकाएँ:

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: एक मिडलवेयर पंजीकृत करें

अपने प्रोजेक्ट सेटिंग्स फ़ाइल में, इस लाइन को जोड़ें

'User_registration_app.custom_cors_middleware.CustomCorsMiddleware'

उदाहरण के लिए:

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

    ]

याद रखें कि user_registration_app को बदलना हैअपने ऐप के नाम के साथ जहाँ आपने अपना custom_cors_middleware.py मॉड्यूल बनाया है।

अब आप यह सत्यापित कर सकते हैं कि यह परियोजना में सभी विचारों के लिए आवश्यक प्रतिक्रिया हेडर जोड़ देगा!


0

Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0

आधिकारिक निर्देश का पालन न करें

अंत में इसका पता लगाने के लिए पुराने तरीके का उपयोग करें।

जोड़ें:

# 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',
    ),
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.